diff options
Diffstat (limited to 'src/documentation/content/xdocs/components/slideshow/how-to-shapes.xml')
-rw-r--r-- | src/documentation/content/xdocs/components/slideshow/how-to-shapes.xml | 642 |
1 files changed, 642 insertions, 0 deletions
diff --git a/src/documentation/content/xdocs/components/slideshow/how-to-shapes.xml b/src/documentation/content/xdocs/components/slideshow/how-to-shapes.xml new file mode 100644 index 0000000000..f1183c357d --- /dev/null +++ b/src/documentation/content/xdocs/components/slideshow/how-to-shapes.xml @@ -0,0 +1,642 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ==================================================================== + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + ==================================================================== +--> +<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "document-v20.dtd"> + +<document> + <header> + <title>Busy Developers' Guide to HSLF drawing layer</title> + <authors> + <person email="yegor@dinom.ru" name="Yegor Kozlov" id="CO"/> + </authors> + </header> + <body> + <section><title>Busy Developers' Guide to HSLF drawing layer</title> + <section><title>Index of Features</title> + <ul> + <li><a href="#NewPresentation">How to create a new presentation and add new slides to it</a></li> + <li><a href="#PageSize">How to retrieve or change slide size</a></li> + <li><a href="#GetShapes">How to get shapes contained in a particular slide</a></li> + <li><a href="#Shapes">Drawing a shape on a slide</a></li> + <li><a href="#Pictures">How to work with pictures</a></li> + <li><a href="#SlideTitle">How to set slide title</a></li> + <li><a href="#Fill">How to work with slide/shape background</a></li> + <li><a href="#Bullets">How to create bulleted lists</a></li> + <li><a href="#Hyperlinks">Hyperlinks</a></li> + <li><a href="#Tables">Tables</a></li> + <li><a href="#RemoveShape">How to remove shapes</a></li> + <li><a href="#OLE">How to retrieve embedded OLE objects</a></li> + <li><a href="#Sound">How to retrieve embedded sounds</a></li> + <li><a href="#Freeform">How to create shapes of arbitrary geometry</a></li> + <li><a href="#Graphics2D">Shapes and Graphics2D</a></li> + <li><a href="#Render">How to convert slides into images</a></li> + <li><a href="#HeadersFooters">Headers / Footers</a></li> + </ul> + </section> + <section><title>Features</title> + <anchor id="NewPresentation"/> + <section><title>New Presentation</title> + <source> + //create a new empty slide show + HSLFSlideShow ppt = new HSLFSlideShow(); + + //add first slide + HSLFSlide s1 = ppt.createSlide(); + + //add second slide + HSLFSlide s2 = ppt.createSlide(); + + //save changes in a file + FileOutputStream out = new FileOutputStream("slideshow.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + <anchor id="PageSize"/> + <section><title>How to retrieve or change slide size</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl("slideshow.ppt")); + //retrieve page size. Coordinates are expressed in points (72 dpi) + java.awt.Dimension pgsize = ppt.getPageSize(); + int pgx = pgsize.width; //slide width + int pgy = pgsize.height; //slide height + + //set new page size + ppt.setPageSize(new java.awt.Dimension(1024, 768)); + //save changes + FileOutputStream out = new FileOutputStream("slideshow.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + <anchor id="GetShapes"/> + <section><title>How to get shapes contained in a particular slide</title> + <p> + The following code demonstrates how to iterate over shapes for each slide. + </p> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl("slideshow.ppt")); + // get slides + for (HSLFSlide slide : ppt.getSlides()) { + for (HSLFShape sh : slide.getShapes()) { + // name of the shape + String name = sh.getShapeName(); + + // shapes's anchor which defines the position of this shape in the slide + java.awt.Rectangle anchor = sh.getAnchor(); + + if (sh instanceof Line) { + Line line = (Line) sh; + // work with Line + } else if (sh instanceof HSLFAutoShape) { + HSLFAutoShape shape = (HSLFAutoShape) sh; + // work with AutoShape + } else if (sh instanceof HSLFTextBox) { + HSLFTextBox shape = (HSLFTextBox) sh; + // work with TextBox + } else if (sh instanceof HSLFPictureShape) { + HSLFPictureShape shape = (HSLFPictureShape) sh; + // work with Picture + } + } + } + </source> + </section> + <anchor id="Shapes"/> + <section><title>Drawing a shape on a slide</title> + <warning> + To work with graphic objects HSLF uses Java2D classes + that may throw exceptions if graphical environment is not available. In case if graphical environment + is not available, you must tell Java that you are running in headless mode and + set the following system property: <code> java.awt.headless=true </code> + (either via <code>-Djava.awt.headless=true</code> startup parameter or via <code>System.setProperty("java.awt.headless", "true")</code>). + </warning> + <p> + When you add a shape, you usually specify the dimensions of the shape and the position + of the upper left corner of the bounding box for the shape relative to the upper left + corner of the slide. Distances in the drawing layer are measured in points (72 points = 1 inch). + </p> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + + HSLFSlide slide = ppt.createSlide(); + + //Line shape + Line line = new Line(); + line.setAnchor(new java.awt.Rectangle(50, 50, 100, 20)); + line.setLineColor(new Color(0, 128, 0)); + line.setLineCompound(LineCompound.DOUBLE); + slide.addShape(line); + + //TextBox + HSLFTextBox txt = new HSLFTextBox(); + txt.setText("Hello, World!"); + txt.setAnchor(new java.awt.Rectangle(300, 100, 300, 50)); + + // use TextRun to work with the text format + HSLFTextParagraph tp = txt.getTextParagraphs().get(0); + tp.setAlignment(TextAlign.RIGHT); + HSLFTextRun rt = tp.getTextRuns().get(0); + rt.setFontSize(32.); + rt.setFontFamily("Arial"); + rt.setBold(true); + rt.setItalic(true); + rt.setUnderlined(true); + rt.setFontColor(Color.red); + + slide.addShape(txt); + + // Autoshape + // 32-point star + HSLFAutoShape sh1 = new HSLFAutoShape(ShapeType.STAR_32); + sh1.setAnchor(new java.awt.Rectangle(50, 50, 100, 200)); + sh1.setFillColor(Color.red); + slide.addShape(sh1); + + //Trapezoid + HSLFAutoShape sh2 = new HSLFAutoShape(ShapeType.TRAPEZOID); + sh2.setAnchor(new java.awt.Rectangle(150, 150, 100, 200)); + sh2.setFillColor(Color.blue); + slide.addShape(sh2); + + FileOutputStream out = new FileOutputStream("slideshow.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + <anchor id="Pictures"/> + <section><title>How to work with pictures</title> + + <p> + Currently, HSLF API supports the following types of pictures: + </p> + <ul> + <li>Windows Metafiles (WMF)</li> + <li>Enhanced Metafiles (EMF)</li> + <li>JPEG Interchange Format</li> + <li>Portable Network Graphics (PNG)</li> + <li>Macintosh PICT</li> + </ul> + + <source> + HSLFSlideShow ppt = new HSLFSlideShow(new HSLFSlideShowImpl("slideshow.ppt")); + + // extract all pictures contained in the presentation + int idx = 1; + for (HSLFPictureData pict : ppt.getPictureData()) { + // picture data + byte[] data = pict.getData(); + + PictureData.PictureType type = pict.getType(); + String ext = type.extension; + FileOutputStream out = new FileOutputStream("pict_" + idx + ext); + out.write(data); + out.close(); + idx++; + } + + // add a new picture to this slideshow and insert it in a new slide + HSLFPictureData pd = ppt.addPicture(new File("clock.jpg"), PictureData.PictureType.JPEG); + + HSLFPictureShape pictNew = new HSLFPictureShape(pd); + + // set image position in the slide + pictNew.setAnchor(new java.awt.Rectangle(100, 100, 300, 200)); + + HSLFSlide slide = ppt.createSlide(); + slide.addShape(pictNew); + + // now retrieve pictures containes in the first slide and save them on disk + idx = 1; + slide = ppt.getSlides().get(0); + for (HSLFShape sh : slide.getShapes()) { + if (sh instanceof HSLFPictureShape) { + HSLFPictureShape pict = (HSLFPictureShape) sh; + HSLFPictureData pictData = pict.getPictureData(); + byte[] data = pictData.getData(); + PictureData.PictureType type = pictData.getType(); + FileOutputStream out = new FileOutputStream("slide0_" + idx + type.extension); + out.write(data); + out.close(); + idx++; + } + } + + FileOutputStream out = new FileOutputStream("slideshow.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + <anchor id="SlideTitle"/> + <section><title>How to set slide title</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + HSLFTextBox title = slide.addTitle(); + title.setText("Hello, World!"); + + // save changes + FileOutputStream out = new FileOutputStream("slideshow.ppt"); + ppt.write(out); + out.close(); + </source> + <p> + Below is the equivalent code in PowerPoint VBA: + </p> + <source> + Set myDocument = ActivePresentation.Slides(1) + myDocument.Shapes.AddTitle.TextFrame.TextRange.Text = "Hello, World!" + </source> + </section> + <anchor id="Fill"/> + <section><title>How to modify background of a slide master</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlideMaster master = ppt.getSlideMasters().get(0); + + HSLFFill fill = master.getBackground().getFill(); + HSLFPictureData pd = ppt.addPicture(new File("background.png"), PictureData.PictureType.PNG); + fill.setFillType(HSLFFill.FILL_PICTURE); + fill.setPictureData(pd); + </source> + </section> + <section><title>How to modify background of a slide</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + + // This slide has its own background. + // Without this line it will use master's background. + slide.setFollowMasterBackground(false); + HSLFFill fill = slide.getBackground().getFill(); + HSLFPictureData pd = ppt.addPicture(new File("background.png"), PictureData.PictureType.PNG); + fill.setFillType(HSLFFill.FILL_PATTERN); + fill.setPictureData(pd); + </source> + </section> + <section><title>How to modify background of a shape</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + + HSLFShape shape = new HSLFAutoShape(ShapeType.RECT); + shape.setAnchor(new java.awt.Rectangle(100, 100, 200, 200)); + HSLFFill fill = shape.getFill(); + fill.setFillType(HSLFFill.FILL_SHADE); + fill.setBackgroundColor(Color.red); + fill.setForegroundColor(Color.green); + + slide.addShape(shape); + </source> + </section> + <anchor id="Bullets"/> + <section><title>How to create bulleted lists</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + + HSLFSlide slide = ppt.createSlide(); + + HSLFTextBox shape = new HSLFTextBox(); + HSLFTextParagraph tp = shape.getTextParagraphs().get(0); + tp.setBullet(true); + tp.setBulletChar('\u263A'); //bullet character + tp.setIndent(0.); //bullet offset + tp.setLeftMargin(50.); //text offset (should be greater than bullet offset) + HSLFTextRun rt = tp.getTextRuns().get(0); + shape.setText( + "January\r" + + "February\r" + + "March\r" + + "April"); + rt.setFontSize(42.); + slide.addShape(shape); + + shape.setAnchor(new java.awt.Rectangle(50, 50, 500, 300)); //position of the text box in the slide + slide.addShape(shape); + + FileOutputStream out = new FileOutputStream("bullets.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + <anchor id="Hyperlinks"/> + <section><title>How to read hyperlinks from a slide show</title> + <source> + FileInputStream is = new FileInputStream("slideshow.ppt"); + HSLFSlideShow ppt = new HSLFSlideShow(is); + is.close(); + + for (HSLFSlide slide : ppt.getSlides()) { + //read hyperlinks from the text runs + for (List<HSLFTextParagraph> txt : slide.getTextParagraphs()) { + for (HSLFTextParagraph para : txt) { + for (HSLFTextRun run : para) { + HSLFHyperlink link = run.getHyperlink(); + if (link != null) { + String title = link.getLabel(); + String address = link.getAddress(); + String text = run.getRawText(); + } + } + } + } + + //in PowerPoint you can assign a hyperlink to a shape without text, + //for example to a Line object. The code below demonstrates how to + //read such hyperlinks + for (HSLFShape sh : slide.getShapes()) { + if (sh instanceof HSLFSimpleShape) { + HSLFHyperlink link = ((HSLFSimpleShape)sh).getHyperlink(); + if(link != null) { + String title = link.getLabel(); + String address = link.getAddress(); + } + } + } + } + </source> + </section> + <anchor id="Tables"/> + <section><title>How to create tables</title> + <source> + //table data + String[][] data = { + {"INPUT FILE", "NUMBER OF RECORDS"}, + {"Item File", "11,559"}, + {"Vendor File", "300"}, + {"Purchase History File", "10,000"}, + {"Total # of requisitions", "10,200,038"} + }; + + HSLFSlideShow ppt = new HSLFSlideShow(); + + HSLFSlide slide = ppt.createSlide(); + //create a table of 5 rows and 2 columns + HSLFTable table = new HSLFTable(5, 2); + for (int i = 0; i < data.length; i++) { + for (int j = 0; j < data[i].length; j++) { + HSLFTableCell cell = table.getCell(i, j); + cell.setText(data[i][j]); + + HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0); + rt.setFontFamily("Arial"); + rt.setFontSize(10.); + + cell.setVerticalAlignment(VerticalAlignment.MIDDLE); + cell.setHorizontalCentered(true); + } + } + + //set table borders + Line border = table.createBorder(); + border.setLineColor(Color.black); + border.setLineWidth(1.0); + table.setAllBorders(border); + + //set width of the 1st column + table.setColumnWidth(0, 300); + //set width of the 2nd column + table.setColumnWidth(1, 150); + + slide.addShape(table); + table.moveTo(100, 100); + + FileOutputStream out = new FileOutputStream("hslf-table.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + + <anchor id="RemoveShape"/> + <section><title>How to remove shapes from a slide</title> + <source> + for (HSLFShape shape : slide.getShapes()) { + // remove the shape + boolean ok = slide.removeShape(shape); + if (ok) { + // the shape was removed. Do something. + } + } + </source> + </section> + <anchor id="OLE"/> + <section><title>How to retrieve embedded OLE objects</title> + <source> + for (HSLFShape shape : slide.getShapes()) { + if (shape instanceof OLEShape) { + OLEShape ole = (OLEShape) shape; + HSLFObjectData data = ole.getObjectData(); + String name = ole.getInstanceName(); + if ("Worksheet".equals(name)) { + HSSFWorkbook wb = new HSSFWorkbook(data.getData()); + } else if ("Document".equals(name)) { + HWPFDocument doc = new HWPFDocument(data.getData()); + } + } + } + </source> + </section> + + <anchor id="Sound"/> + <section><title>How to retrieve embedded sounds</title> + <source> + FileInputStream is = new FileInputStream(args[0]); + HSLFSlideShow ppt = new HSLFSlideShow(is); + is.close(); + + for (HSLFSoundData sound : ppt.getSoundData()) { + // save *WAV sounds on disk + if (sound.getSoundType().equals(".WAV")) { + FileOutputStream out = new FileOutputStream(sound.getSoundName()); + out.write(sound.getData()); + out.close(); + } + } + </source> + </section> + + <anchor id="Freeform"/> + <section><title>How to create shapes of arbitrary geometry</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + + java.awt.geom.GeneralPath path = new java.awt.geom.GeneralPath(); + path.moveTo(100, 100); + path.lineTo(200, 100); + path.curveTo(50, 45, 134, 22, 78, 133); + path.curveTo(10, 45, 134, 56, 78, 100); + path.lineTo(100, 200); + path.closePath(); + + HSLFFreeformShape shape = new HSLFFreeformShape(); + shape.setPath(path); + slide.addShape(shape); + </source> + </section> + + <anchor id="Graphics2D"/> + <section><title>How to draw into a slide using Graphics2D</title> + <warning> + Current implementation of the PowerPoint Graphics2D driver is not fully compliant with the java.awt.Graphics2D specification. + Some features like clipping, drawing of images are not yet supported. + </warning> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + HSLFSlide slide = ppt.createSlide(); + + // draw a simple bar graph + // bar chart data. + // The first value is the bar color, + // the second is the width + Object[] def = new Object[]{ + Color.yellow, new Integer(100), + Color.green, new Integer(150), + Color.gray, new Integer(75), + Color.red, new Integer(200), + }; + + // all objects are drawn into a shape group so we need to create one + + HSLFGroupShape group = new HSLFGroupShape(); + // define position of the drawing in the slide + Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300); + // if you want to draw in the entire slide area then define the anchor + // as follows: + // Dimension pgsize = ppt.getPageSize(); + // java.awt.Rectangle bounds = new java.awt.Rectangle(0, 0, + // pgsize.width, pgsize.height); + + group.setAnchor(bounds); + slide.addShape(group); + + // draw a simple bar chart + Graphics2D graphics = new PPGraphics2D(group); + int x = bounds.x + 50, y = bounds.y + 50; + graphics.setFont(new Font("Arial", Font.BOLD, 10)); + for (int i = 0, idx = 1; i < def.length; i += 2, idx++) { + graphics.setColor(Color.black); + int width = ((Integer) def[i + 1]).intValue(); + graphics.drawString("Q" + idx, x - 20, y + 20); + graphics.drawString(width + "%", x + width + 10, y + 20); + graphics.setColor((Color) def[i]); + graphics.fill(new Rectangle(x, y, width, 30)); + y += 40; + } + graphics.setColor(Color.black); + graphics.setFont(new Font("Arial", Font.BOLD, 14)); + graphics.draw(bounds); + graphics.drawString("Performance", x + 70, y + 40); + + FileOutputStream out = new FileOutputStream("hslf-graphics2d.ppt"); + ppt.write(out); + out.close(); + </source> + </section> + + <anchor id="Render"/> + <section><title>Export PowerPoint slides into java.awt.Graphics2D</title> + <p> + HSLF provides a way to export slides into images. You can capture slides into java.awt.Graphics2D object (or any other) + and serialize it into a PNG or JPEG format. Please note, although HSLF attempts to render slides as close to PowerPoint as possible, + the output may look differently from PowerPoint due to the following reasons: + </p> + <ul> + <li>Java2D renders fonts differently vs PowerPoint. There are always some differences in the way the font glyphs are painted</li> + <li>HSLF uses java.awt.font.LineBreakMeasurer to break text into lines. PowerPoint may do it in a different way.</li> + <li>If a font from the presentation is not available, then the JDK default font will be used.</li> + </ul> + <p> + Current Limitations: + </p> + <ul> + <li>Some types of shapes are not yet supported (WordArt, complex auto-shapes)</li> + <li>Only Bitmap images (PNG, JPEG, DIB) can be rendered in Java</li> + </ul> + <source> + FileInputStream is = new FileInputStream("slideshow.ppt"); + HSLFSlideShow ppt = new HSLFSlideShow(is); + is.close(); + + Dimension pgsize = ppt.getPageSize(); + + int idx = 1; + for (HSLFSlide slide : ppt.getSlides()) { + + BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB); + Graphics2D graphics = img.createGraphics(); + // clear the drawing area + graphics.setPaint(Color.white); + graphics.fill(new Rectangle2D.Float(0, 0, pgsize.width, pgsize.height)); + + // render + slide.draw(graphics); + + // save the output + FileOutputStream out = new FileOutputStream("slide-" + idx + ".png"); + javax.imageio.ImageIO.write(img, "png", out); + out.close(); + + idx++; + } + </source> + </section> + + </section> + <anchor id="HeadersFooters"/> + <section><title>How to extract Headers / Footers from an existing presentation</title> + <source> + FileInputStream is = new FileInputStream("slideshow.ppt"); + HSLFSlideShow ppt = new HSLFSlideShow(is); + is.close(); + + // presentation-scope headers / footers + HeadersFooters hdd = ppt.getSlideHeadersFooters(); + if (hdd.isFooterVisible()) { + String footerText = hdd.getFooterText(); + } + + // per-slide headers / footers + for (HSLFSlide slide : ppt.getSlides()) { + HeadersFooters hdd2 = slide.getHeadersFooters(); + if (hdd2.isFooterVisible()) { + String footerText = hdd2.getFooterText(); + } + if (hdd2.isUserDateVisible()) { + String customDate = hdd2.getDateTimeText(); + } + if (hdd2.isSlideNumberVisible()) { + int slideNUm = slide.getSlideNumber(); + } + } + </source> + </section> + <section><title>How to set Headers / Footers</title> + <source> + HSLFSlideShow ppt = new HSLFSlideShow(); + + // presentation-scope headers / footers + HeadersFooters hdd = ppt.getSlideHeadersFooters(); + hdd.setSlideNumberVisible(true); + hdd.setFootersText("Created by POI-HSLF"); + </source> + </section> + </section> + </body> +</document> |