diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml
index 0fb5cac07c..d0d73c8d8a 100644
--- a/src/documentation/content/xdocs/changes.xml
+++ b/src/documentation/content/xdocs/changes.xml
@@ -43,7 +43,13 @@
Created a common interface for handling PowerPoint files, irrespective of if they are .ppt or .pptxCreated a common interface for handling Excel files, irrespective of if they are .xls or .xlsx
-
+
+ HSLF: Support for getting embedded sounds from slide show
+ HSLF: Initial support for rendering slides into images
+ HSLF: Support for getting OLE object data from slide show
+ HSLF: Implemented more methods in PPGraphics2D
+ HSLF: Added Freeform shape which can contain both lines and Bezier curves
+ 41071 - Improved text extraction in HSLF30311 - Conditional Formatting - improved API, added HSSFSheetConditionalFormattingUpdate the formula parser code to use a HSSFWorkbook, rather than the low level model.Workbook, to make things cleaner and make supporting XSSF formulas in future much easierFix the logger used by POIFSFileSystem, so that commons-logging isn't required when not used
diff --git a/src/documentation/content/xdocs/index.xml b/src/documentation/content/xdocs/index.xml
index 5d5067c8a9..e6f136652b 100644
--- a/src/documentation/content/xdocs/index.xml
+++ b/src/documentation/content/xdocs/index.xml
@@ -136,8 +136,7 @@
HSLF for PowerPoint Documents
HSLF is our port of the Microsoft PowerPoint 97(-2003) file format to pure
- Java. It supports read and write capabilities of some, but not yet all
- of the core records. Please see the HSLF project page for more
information.
diff --git a/src/documentation/content/xdocs/poifs/embeded.xml b/src/documentation/content/xdocs/poifs/embeded.xml
index d888e2ed53..a4620f5a94 100644
--- a/src/documentation/content/xdocs/poifs/embeded.xml
+++ b/src/documentation/content/xdocs/poifs/embeded.xml
@@ -61,9 +61,9 @@
Files embeded in PowerPoint
PowerPoint does not normally store embeded files
in the OLE2 layer. Instead, they are held within records
- of the main PowerPoint file. To get at them, you need to
- find the appropriate data within the PowerPoint stream,
- and work from that.
+ of the main PowerPoint file.
+ See the HSLF Tutorial
+ for how to retrieve embedded OLE objects from a presentation
Features
@@ -80,14 +86,8 @@
How to get shapes contained in a particular slide
-
The superclass of all shapes in HSLF is the Shape class - the elemental object that composes a drawing.
- The following pictute shows the class tree of HSLF shapes:
-
-
-
-
- The following fragment demonstrates how to iterate over shapes for each slide.
+ The following code demonstrates how to iterate over shapes for each slide.
SlideShow ppt = new SlideShow(new HSLFSlideShow("slideshow.ppt"));
@@ -440,7 +440,186 @@
-
+
+ How to remove shapes from a slide
+
+
+ Shape[] shape = slide.getShapes();
+ for (int i = 0; i < shape.length; i++) {
+
+ //remove the shape
+ boolean ok = slide.removeShape(shape[i]);
+ if(ok){
+ //the shape was removed. Do something.
+ }
+ }
+
+
+
+ How to retrieve embedded OLE objects
+
+
+ Shape[] shape = slide.getShapes();
+ for (int i = 0; i < shape.length; i++) {
+ if (shape[i] instanceof OLEShape) {
+ OLEShape ole = (OLEShape) shape[i];
+ ObjectData 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 sounds
+
+
+ FileInputStream is = new FileInputStream(args[0]);
+ SlideShow ppt = new SlideShow(is);
+ is.close();
+
+ SoundData[] sound = ppt.getSoundData();
+ for (int i = 0; i < sound.length; i++) {
+ //save *WAV sounds on disk
+ if(sound[i].getSoundType().equals(".WAV")){
+ FileOutputStream out = new FileOutputStream(sound[i].getSoundName());
+ out.write(sound[i].getData());
+ out.close();
+ }
+ }
+
+
+
+
+ How to create shapes of arbitrary geometry
+
+
+ SlideShow ppt = new SlideShow();
+ Slide 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();
+
+ Freeform shape = new Freeform();
+ shape.setPath(path);
+ slide.addShape(shape);
+
+
+
+
+ How to draw into a slide using Graphics2D
+
+ 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.
+
+
+ SlideShow ppt = new SlideShow();
+ Slide 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
+
+ ShapeGroup group = new ShapeGroup();
+ //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.Graphics2D
+
+ 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:
+
+
+
Java2D renders fonts differently vs PowerPoint. There are always some differences in the way the font glyphs are painted
+
HSLF uses java.awt.font.LineBreakMeasurer to break text into lines. PowerPoint may do it in a different way.
+
If a font from the presentation is not avaiable, then the JDK default font will be used.
+
+
+ Current Limitations:
+
+
+
Some types of shapes are not yet supported (WordArt, complex auto-shapes)
+
Only Bitmap images (PNG, JPEG, DIB) can be rendered in Java
+
+
+ FileInputStream is = new FileInputStream("slideshow.ppt");
+ SlideShow ppt = new SlideShow(is);
+ is.close();
+
+ Dimension pgsize = ppt.getPageSize();
+
+ Slide[] slide = ppt.getSlides();
+ for (int i = 0; i < slide.length; i++) {
+
+ 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[i].draw(graphics);
+
+ //save the output
+ FileOutputStream out = new FileOutputStream("slide-" + (i+1) + ".png");
+ javax.imageio.ImageIO.write(img, "png", out);
+ out.close();
+ }
+
+
+
+
+