Apache | POI |
Home |
|
Busy Developers' Guide to HSLF drawing layerBusy Developers' Guide to HSLF drawing layerIndex of Features
FeaturesNew Presentation//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(); How to retrieve or change slide sizeHSLFSlideShow 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(); How to get shapes contained in a particular slideThe following code demonstrates how to iterate over shapes for each slide. 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 } } } Drawing a shape on a slideWarning
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: java.awt.headless=true
(either via -Djava.awt.headless=true startup parameter or via System.setProperty("java.awt.headless", "true")).
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). 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(); How to work with picturesCurrently, HSLF API supports the following types of pictures:
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(); How to set slide titleHSLFSlideShow 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(); Below is the equivalent code in PowerPoint VBA: Set myDocument = ActivePresentation.Slides(1) myDocument.Shapes.AddTitle.TextFrame.TextRange.Text = "Hello, World!" How to modify background of a slide masterHSLFSlideShow 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); How to modify background of a slideHSLFSlideShow 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); How to modify background of a shapeHSLFSlideShow 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); How to create bulleted listsHSLFSlideShow 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(); How to read hyperlinks from a slide showFileInputStream 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()) { String text = HSLFTextParagraph.getText(txt); for (HSLFHyperlink link : HSLFHyperlink.find(txt)) { String title = link.getTitle(); String address = link.getAddress(); String substring = text.substring(link.getStartIndex(), link.getEndIndex()-1); //in ppt end index is inclusive } } //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()) { HSLFHyperlink link = sh.getHyperlink(); if(link != null) { String title = link.getTitle(); String address = link.getAddress(); } } } How to create tables//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(); How to remove shapes from a slidefor (HSLFShape shape : slide.getShapes()) { // remove the shape boolean ok = slide.removeShape(shape); if (ok) { // the shape was removed. Do something. } } How to retrieve embedded OLE objectsfor (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()); } } } How to retrieve embedded soundsFileInputStream 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(); } } How to create shapes of arbitrary geometryHSLFSlideShow 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); How to draw into a slide using Graphics2DWarning
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.
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(); Export PowerPoint slides into java.awt.Graphics2DHSLF 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:
Current Limitations:
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++; } How to extract Headers / Footers from an existing presentationFileInputStream 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(); } } How to set Headers / FootersHSLFSlideShow ppt = new HSLFSlideShow(); // presentation-scope headers / footers HeadersFooters hdd = ppt.getSlideHeadersFooters(); hdd.setSlideNumberVisible(true); hdd.setFootersText("Created by POI-HSLF"); |