<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
</release>
<release version="3.0.3-beta1" date="2008-04-??">
+ <action dev="POI-DEVELOPERS" type="fix">Fix the logger used by POIFSFileSystem, so that commons-logging isn't required when not used</action>
<action dev="POI-DEVELOPERS" type="add">Update HSLFSlideShow and HSSFWorkbook to take advantage of POIFS updates, and allow reading embeded documents</action>
<action dev="POI-DEVELOPERS" type="add">Improve how POIFS works with directory entries, and update HWPFDocument to support reading an embeded word document</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for getting and changing chart and series titles</action>
<action dev="POI-DEVELOPERS" type="add">Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx</action>
</release>
<release version="3.0.3-beta1" date="2008-04-??">
+ <action dev="POI-DEVELOPERS" type="fix">Fix the logger used by POIFSFileSystem, so that commons-logging isn't required when not used</action>
<action dev="POI-DEVELOPERS" type="add">Update HSLFSlideShow and HSSFWorkbook to take advantage of POIFS updates, and allow reading embeded documents</action>
<action dev="POI-DEVELOPERS" type="add">Improve how POIFS works with directory entries, and update HWPFDocument to support reading an embeded word document</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for getting and changing chart and series titles</action>
import java.util.Iterator;
import java.util.List;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.dev.POIFSViewable;
import org.apache.poi.poifs.property.DirectoryProperty;
import org.apache.poi.poifs.storage.SmallBlockTableWriter;
import org.apache.poi.util.IOUtils;
import org.apache.poi.util.LongField;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
/**
* This is the main class of the POIFS system; it manages the entire
public class POIFSFileSystem
implements POIFSViewable
{
- private static final Log _logger = LogFactory.getLog(POIFSFileSystem.class);
+ private static final POILogger _logger =
+ POILogFactory.getLogger(POIFSFileSystem.class);
private static final class CloseIgnoringInputStream extends InputStream {
+ "This will be a problem for the caller if the stream will still be used. "
+ "If that is the case the caller should wrap the input stream to avoid this close logic. "
+ "This warning is only temporary and will not be present in future versions of POI.";
- _logger.warn(msg);
+ _logger.log(POILogger.WARN, msg);
}
try {
stream.close();
--- /dev/null
+\r
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+\r
+package org.apache.poi.hslf.examples;\r
+\r
+import org.apache.poi.hslf.usermodel.*;\r
+import org.apache.poi.hslf.model.*;\r
+import org.apache.poi.hslf.record.TextHeaderAtom;\r
+\r
+import java.io.IOException;\r
+import java.io.FileOutputStream;\r
+import java.io.File;\r
+import java.awt.*;\r
+\r
+/**\r
+ * Presentation for Fast Feather Track on ApacheconEU 2008\r
+ * \r
+ * @author Yegor Kozlov\r
+ */\r
+public class ApacheconEU08 {\r
+\r
+ public static void main(String[] args) throws IOException {\r
+ SlideShow ppt = new SlideShow();\r
+ ppt.setPageSize(new Dimension(720, 540));\r
+\r
+ slide1(ppt);\r
+ slide2(ppt);\r
+ slide3(ppt);\r
+ slide4(ppt);\r
+ slide5(ppt);\r
+ slide6(ppt);\r
+ slide7(ppt);\r
+ slide8(ppt);\r
+ slide9(ppt);\r
+ slide10(ppt);\r
+ slide11(ppt);\r
+ slide12(ppt);\r
+\r
+ FileOutputStream out = new FileOutputStream("apachecon_eu_08.ppt");\r
+ ppt.write(out);\r
+ out.close();\r
+\r
+ }\r
+\r
+ public static void slide1(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);\r
+ tr1.setText("POI-HSLF");\r
+ box1.setAnchor(new Rectangle(54, 78, 612, 115));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);\r
+ tr2.setText("Java API To Access Microsoft PowerPoint Format Files");\r
+ box2.setAnchor(new Rectangle(108, 204, 504, 138));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.getRichTextRuns()[0].setFontSize(32);\r
+ box3.setHorizontalAlignment(TextBox.AlignCenter);\r
+ tr3.setText(\r
+ "Yegor Kozlov\r" +\r
+ "yegor - apache - org");\r
+ box3.setAnchor(new Rectangle(206, 348, 310, 84));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide2(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("What is HSLF?");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText("HorribleSLideshowFormat is the POI Project's pure Java implementation " +\r
+ "of the Powerpoint binary file format. \r" +\r
+ "POI sub-project since 2005\r" +\r
+ "Started by Nick Birch, Yegor Kozlov joined soon after");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 356));\r
+ slide.addShape(box2);\r
+\r
+\r
+ }\r
+\r
+ public static void slide3(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in a Nutshell");\r
+ box1.setAnchor(new Rectangle(36, 15, 648, 65));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "HSLF provides a way to read, create and modify MS PowerPoint presentations\r" +\r
+ "Pure Java API - you don't need PowerPoint to read and write *.ppt files\r" +\r
+ "Comprehensive support of PowerPoint objects");\r
+ tr2.getRichTextRuns()[0].setFontSize(28);\r
+ box2.setAnchor(new Rectangle(36, 80, 648, 200));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr3.setText(\r
+ "Rich text\r" +\r
+ "Tables\r" +\r
+ "Shapes\r" +\r
+ "Pictures\r" +\r
+ "Master slides");\r
+ tr3.getRichTextRuns()[0].setFontSize(24);\r
+ tr3.getRichTextRuns()[0].setIndentLevel(1);\r
+ box3.setAnchor(new Rectangle(36, 265, 648, 150));\r
+ slide.addShape(box3);\r
+\r
+ TextBox box4 = new TextBox();\r
+ TextRun tr4 = box4.getTextRun();\r
+ tr4.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr4.setText("Access to low level data structures");\r
+ box4.setAnchor(new Rectangle(36, 430, 648, 50));\r
+ slide.addShape(box4);\r
+ }\r
+\r
+ public static void slide4(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ String[][] txt1 = {\r
+ {"Note"},\r
+ {"This presentation was created programmatically using POI HSLF"}\r
+ };\r
+ Table table1 = new Table(2, 1);\r
+ for (int i = 0; i < txt1.length; i++) {\r
+ for (int j = 0; j < txt1[i].length; j++) {\r
+ TableCell cell = table1.getCell(i, j);\r
+ cell.setText(txt1[i][j]);\r
+ cell.getTextRun().getRichTextRuns()[0].setFontSize(10);\r
+ RichTextRun rt = cell.getTextRun().getRichTextRuns()[0];\r
+ rt.setFontName("Arial");\r
+ rt.setBold(true);\r
+ if(i == 0){\r
+ rt.setFontSize(32);\r
+ rt.setFontColor(Color.white);\r
+ cell.getFill().setForegroundColor(new Color(0, 153, 204));\r
+ } else {\r
+ rt.setFontSize(28);\r
+ cell.getFill().setForegroundColor(new Color(235, 239, 241));\r
+ }\r
+ cell.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ }\r
+ }\r
+\r
+ Line border1 = table1.createBorder();\r
+ border1.setLineColor(Color.black);\r
+ border1.setLineWidth(1.0);\r
+ table1.setAllBorders(border1);\r
+\r
+ Line border2 = table1.createBorder();\r
+ border2.setLineColor(Color.black);\r
+ border2.setLineWidth(2.0);\r
+ table1.setOutsideBorders(border2);\r
+\r
+ table1.setColumnWidth(0, 510);\r
+ table1.setRowHeight(0, 60);\r
+ table1.setRowHeight(1, 100);\r
+ slide.addShape(table1);\r
+\r
+ table1.moveTo(100, 100);\r
+\r
+ TextBox box1 = new TextBox();\r
+ box1.setHorizontalAlignment(TextBox.AlignCenter);\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setText("The source code is available at\r" +\r
+ "http://people.apache.org/~yegor/apachecon_eu08/");\r
+ RichTextRun rt = tr1.getRichTextRuns()[0];\r
+ rt.setFontSize(24);\r
+ box1.setAnchor(new Rectangle(80, 356, 553, 65));\r
+ slide.addShape(box1);\r
+\r
+ }\r
+\r
+ public static void slide5(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 1\rData Extraction");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 100));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Text from slides and notes\r" +\r
+ "Images\r" +\r
+ "Shapes and their properties (type, position in the slide, color, font, etc.)");\r
+ box2.setAnchor(new Rectangle(36, 150, 648, 300));\r
+ slide.addShape(box2);\r
+\r
+\r
+ }\r
+\r
+ public static void slide6(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 2");\r
+ box1.setAnchor(new Rectangle(36, 20, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.getRichTextRuns()[0].setFontSize(18);\r
+ tr2.setText("Creating a simple presentation from scratch");\r
+ box2.setAnchor(new Rectangle(170, 100, 364, 30));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ RichTextRun rt3 = tr3.getRichTextRuns()[0];\r
+ rt3.setFontName("Courier New");\r
+ rt3.setFontSize(8);\r
+ tr3.setText(\r
+ " SlideShow ppt = new SlideShow();\r" +\r
+ " Slide slide = ppt.createSlide();\r" +\r
+ "\r" +\r
+ " TextBox box2 = new TextBox();\r" +\r
+ " box2.setHorizontalAlignment(TextBox.AlignCenter);\r" +\r
+ " box2.setVerticalAlignment(TextBox.AnchorMiddle);\r" +\r
+ " box2.getTextRun().setText(\"Java Code\");\r" +\r
+ " box2.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box2.setLineColor(Color.black);\r" +\r
+ " box2.setLineWidth(0.75);\r" +\r
+ " box2.setAnchor(new Rectangle(66, 243, 170, 170));\r" +\r
+ " slide.addShape(box2);\r" +\r
+ "\r" +\r
+ " TextBox box3 = new TextBox();\r" +\r
+ " box3.setHorizontalAlignment(TextBox.AlignCenter);\r" +\r
+ " box3.setVerticalAlignment(TextBox.AnchorMiddle);\r" +\r
+ " box3.getTextRun().setText(\"*.ppt file\");\r" +\r
+ " box3.setLineWidth(0.75);\r" +\r
+ " box3.setLineColor(Color.black);\r" +\r
+ " box3.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box3.setAnchor(new Rectangle(473, 243, 170, 170));\r" +\r
+ " slide.addShape(box3);\r" +\r
+ "\r" +\r
+ " AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\r" +\r
+ " box4.getFill().setForegroundColor(new Color(187, 224, 227));\r" +\r
+ " box4.setLineWidth(0.75);\r" +\r
+ " box4.setLineColor(Color.black);\r" +\r
+ " box4.setAnchor(new Rectangle(253, 288, 198, 85));\r" +\r
+ " slide.addShape(box4);\r" +\r
+ "\r" +\r
+ " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +\r
+ " ppt.write(out);\r" +\r
+ " out.close();");\r
+ box3.setAnchor(new Rectangle(30, 150, 618, 411));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide7(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box2 = new TextBox();\r
+ box2.setHorizontalAlignment(TextBox.AlignCenter);\r
+ box2.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ box2.getTextRun().setText("Java Code");\r
+ box2.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box2.setLineColor(Color.black);\r
+ box2.setLineWidth(0.75);\r
+ box2.setAnchor(new Rectangle(66, 243, 170, 170));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ box3.setHorizontalAlignment(TextBox.AlignCenter);\r
+ box3.setVerticalAlignment(TextBox.AnchorMiddle);\r
+ box3.getTextRun().setText("*.ppt file");\r
+ box3.setLineWidth(0.75);\r
+ box3.setLineColor(Color.black);\r
+ box3.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box3.setAnchor(new Rectangle(473, 243, 170, 170));\r
+ slide.addShape(box3);\r
+\r
+ AutoShape box4 = new AutoShape(ShapeTypes.Arrow);\r
+ box4.getFill().setForegroundColor(new Color(187, 224, 227));\r
+ box4.setLineWidth(0.75);\r
+ box4.setLineColor(Color.black);\r
+ box4.setAnchor(new Rectangle(253, 288, 198, 85));\r
+ slide.addShape(box4);\r
+ }\r
+\r
+ public static void slide8(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("Wait, there is more!");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Rich text\r" +\r
+ "Tables\r" +\r
+ "Pictures (JPEG, PNG, BMP, WMF, PICT)\r" +\r
+ "Comprehensive formatting features");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 356));\r
+ slide.addShape(box2);\r
+ }\r
+\r
+ public static void slide9(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF in Action - 3");\r
+ box1.setAnchor(new Rectangle(36, 20, 648, 50));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.getRichTextRuns()[0].setFontSize(18);\r
+ tr2.setText("PPGraphics2D: PowerPoint Graphics2D driver");\r
+ box2.setAnchor(new Rectangle(178, 70, 387, 30));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ RichTextRun rt3 = tr3.getRichTextRuns()[0];\r
+ rt3.setFontName("Courier New");\r
+ rt3.setFontSize(8);\r
+ tr3.setText(\r
+ " //bar chart data. The first value is the bar color, the second is the width\r" +\r
+ " Object[] def = new Object[]{\r" +\r
+ " Color.yellow, new Integer(100),\r" +\r
+ " Color.green, new Integer(150),\r" +\r
+ " Color.gray, new Integer(75),\r" +\r
+ " Color.red, new Integer(200),\r" +\r
+ " };\r" +\r
+ "\r" +\r
+ " SlideShow ppt = new SlideShow();\r" +\r
+ " Slide slide = ppt.createSlide();\r" +\r
+ "\r" +\r
+ " ShapeGroup group = new ShapeGroup();\r" +\r
+ " //define position of the drawing in the slide\r" +\r
+ " Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\r" +\r
+ " group.setAnchor(bounds);\r" +\r
+ " slide.addShape(group);\r" +\r
+ " Graphics2D graphics = new PPGraphics2D(group);\r" +\r
+ "\r" +\r
+ " //draw a simple bar graph\r" +\r
+ " int x = bounds.x + 50, y = bounds.y + 50;\r" +\r
+ " graphics.setFont(new Font(\"Arial\", Font.BOLD, 10));\r" +\r
+ " for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\r" +\r
+ " graphics.setColor(Color.black);\r" +\r
+ " int width = ((Integer)def[i+1]).intValue();\r" +\r
+ " graphics.drawString(\"Q\" + idx, x-20, y+20);\r" +\r
+ " graphics.drawString(width + \"%\", x + width + 10, y + 20);\r" +\r
+ " graphics.setColor((Color)def[i]);\r" +\r
+ " graphics.fill(new Rectangle(x, y, width, 30));\r" +\r
+ " y += 40;\r" +\r
+ " }\r" +\r
+ " graphics.setColor(Color.black);\r" +\r
+ " graphics.setFont(new Font(\"Arial\", Font.BOLD, 14));\r" +\r
+ " graphics.draw(bounds);\r" +\r
+ " graphics.drawString(\"Performance\", x + 70, y + 40);\r" +\r
+ "\r" +\r
+ " FileOutputStream out = new FileOutputStream(\"hslf-demo.ppt\");\r" +\r
+ " ppt.write(out);\r" +\r
+ " out.close();");\r
+ box3.setAnchor(new Rectangle(96, 110, 499, 378));\r
+ slide.addShape(box3);\r
+ }\r
+\r
+ public static void slide10(SlideShow ppt) throws IOException {\r
+ //bar chart data. The first value is the bar color, the second is the width\r
+ Object[] def = new Object[]{\r
+ Color.yellow, new Integer(100),\r
+ Color.green, new Integer(150),\r
+ Color.gray, new Integer(75),\r
+ Color.red, new Integer(200),\r
+ };\r
+\r
+ Slide slide = ppt.createSlide();\r
+\r
+ ShapeGroup group = new ShapeGroup();\r
+ //define position of the drawing in the slide\r
+ Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);\r
+ group.setAnchor(bounds);\r
+ slide.addShape(group);\r
+ Graphics2D graphics = new PPGraphics2D(group);\r
+\r
+ //draw a simple bar graph\r
+ int x = bounds.x + 50, y = bounds.y + 50;\r
+ graphics.setFont(new Font("Arial", Font.BOLD, 10));\r
+ for (int i = 0, idx = 1; i < def.length; i+=2, idx++) {\r
+ graphics.setColor(Color.black);\r
+ int width = ((Integer)def[i+1]).intValue();\r
+ graphics.drawString("Q" + idx, x-20, y+20);\r
+ graphics.drawString(width + "%", x + width + 10, y + 20);\r
+ graphics.setColor((Color)def[i]);\r
+ graphics.fill(new Rectangle(x, y, width, 30));\r
+ y += 40;\r
+ }\r
+ graphics.setColor(Color.black);\r
+ graphics.setFont(new Font("Arial", Font.BOLD, 14));\r
+ graphics.draw(bounds);\r
+ graphics.drawString("Performance", x + 70, y + 40);\r
+\r
+ }\r
+\r
+ public static void slide11(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.TITLE_TYPE);\r
+ tr1.setText("HSLF Development Plans");\r
+ box1.setAnchor(new Rectangle(36, 21, 648, 90));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr2.setText(\r
+ "Support for more PowerPoint functionality\r" +\r
+ "Rendering slides into java.awt.Graphics2D");\r
+ box2.setAnchor(new Rectangle(36, 126, 648, 100));\r
+ slide.addShape(box2);\r
+\r
+ TextBox box3 = new TextBox();\r
+ TextRun tr3 = box3.getTextRun();\r
+ tr3.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr3.getRichTextRuns()[0].setIndentLevel(1);\r
+ tr3.setText(\r
+ "A way to export slides into images or other formats");\r
+ box3.setAnchor(new Rectangle(36, 220, 648, 70));\r
+ slide.addShape(box3);\r
+\r
+ TextBox box4 = new TextBox();\r
+ TextRun tr4 = box4.getTextRun();\r
+ tr4.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr4.setText(\r
+ "Integration with Apache FOP - Formatting Objects Processor");\r
+ box4.setAnchor(new Rectangle(36, 290, 648, 90));\r
+ slide.addShape(box4);\r
+\r
+ TextBox box5 = new TextBox();\r
+ TextRun tr5 = box5.getTextRun();\r
+ tr5.setRunType(TextHeaderAtom.BODY_TYPE);\r
+ tr5.getRichTextRuns()[0].setIndentLevel(1);\r
+ tr5.setText(\r
+ "Transformation of XSL-FO into PPT\r" +\r
+ "PPT2PDF transcoder");\r
+ box5.setAnchor(new Rectangle(36, 380, 648, 100));\r
+ slide.addShape(box5);\r
+ }\r
+\r
+ public static void slide12(SlideShow ppt) throws IOException {\r
+ Slide slide = ppt.createSlide();\r
+\r
+ TextBox box1 = new TextBox();\r
+ TextRun tr1 = box1.getTextRun();\r
+ tr1.setRunType(TextHeaderAtom.CENTER_TITLE_TYPE);\r
+ tr1.setText("Questions?");\r
+ box1.setAnchor(new Rectangle(54, 167, 612, 115));\r
+ slide.addShape(box1);\r
+\r
+ TextBox box2 = new TextBox();\r
+ TextRun tr2 = box2.getTextRun();\r
+ tr2.setRunType(TextHeaderAtom.CENTRE_BODY_TYPE);\r
+ tr2.setText(\r
+ "http://poi.apache.org/hslf/\r" +\r
+ "http://people.apache.org/~yegor");\r
+ box2.setAnchor(new Rectangle(108, 306, 504, 138));\r
+ slide.addShape(box2);\r
+ }\r
+}\r
import org.apache.poi.hslf.record.UserEditAtom;
import org.apache.poi.hslf.usermodel.ObjectData;
import org.apache.poi.hslf.usermodel.PictureData;
+import org.apache.poi.hslf.model.Shape;
import org.apache.poi.poifs.filesystem.DirectoryNode;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* This class contains the main functionality for the Powerpoint file
public class HSLFSlideShow extends POIDocument
{
// For logging
- protected POILogger logger = POILogFactory.getLogger(this.getClass());
+ private static final Log logger = LogFactory.getLog(HSLFSlideShow.class);
private InputStream istream;
try {
currentUser = new CurrentUserAtom(directory);
} catch(IOException ie) {
- logger.log(POILogger.ERROR, "Error finding Current User Atom:\n" + ie);
+ logger.error("Error finding Current User Atom:\n" + ie);
currentUser = new CurrentUserAtom();
}
}
// If they type (including the bonus 0xF018) is 0, skip it
if(type == 0) {
- logger.log(POILogger.ERROR, "Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
- logger.log(POILogger.ERROR, "" + pos);
+ logger.error("Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
+ logger.error("" + pos);
} else {
// Copy the data, ready to pass to PictureData
byte[] imgdata = new byte[imgsize];
pict.setOffset(offset);
p.add(pict);
} catch(IllegalArgumentException e) {
- logger.log(POILogger.ERROR, "Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
+ logger.error("Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
}
}
import org.apache.poi.hslf.usermodel.PictureData;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.awt.*;
import java.util.*;
*/
public class Fill {
// For logging
- protected POILogger logger = POILogFactory.getLogger(this.getClass());
+ protected Log log = LogFactory.getLog(this.getClass());
/**
* Fill with a solid color
public void setForegroundColor(Color color){
EscherOptRecord opt = (EscherOptRecord)Shape.getEscherChild(shape.getSpContainer(), EscherOptRecord.RECORD_ID);
if (color == null) {
- Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, -1);
- Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150010);
+ Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
}
else {
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
java.util.List lst = bstore.getChildRecords();
int idx = p.getPropertyValue();
if (idx == 0){
- logger.log(POILogger.ERROR, "no reference to picture data found ");
+ log.error("no reference to picture data found ");
} else {
EscherBSERecord bse = (EscherBSERecord)lst.get(idx - 1);
for ( int i = 0; i < pict.length; i++ ) {
--- /dev/null
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.hslf.model;\r
+\r
+import org.apache.poi.ddf.*;\r
+import org.apache.poi.util.LittleEndian;\r
+\r
+import java.awt.geom.*;\r
+import java.util.ArrayList;\r
+\r
+/**\r
+ * A "Freeform" shape.\r
+ *\r
+ * <p>\r
+ * Shapes drawn with the "Freeform" tool have cubic bezier curve segments in the smooth sections\r
+ * and straight-line segments in the straight sections. This object closely corresponds to <code>java.awt.geom.GeneralPath</code>.\r
+ * </p>\r
+ * @author Yegor Kozlov\r
+ */\r
+public class Freeform extends AutoShape {\r
+ /**\r
+ * Create a Freeform object and initialize it from the supplied Record container.\r
+ *\r
+ * @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape\r
+ * @param parent the parent of the shape\r
+ */\r
+ protected Freeform(EscherContainerRecord escherRecord, Shape parent){\r
+ super(escherRecord, parent);\r
+\r
+ }\r
+\r
+ /**\r
+ * Create a new Freeform. This constructor is used when a new shape is created.\r
+ *\r
+ * @param parent the parent of this Shape. For example, if this text box is a cell\r
+ * in a table then the parent is Table.\r
+ */\r
+ public Freeform(Shape parent){\r
+ super(null, parent);\r
+ _escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);\r
+ }\r
+\r
+ /**\r
+ * Create a new Freeform. This constructor is used when a new shape is created.\r
+ *\r
+ */\r
+ public Freeform(){\r
+ this(null);\r
+ }\r
+\r
+ /**\r
+ * Set the shape path\r
+ *\r
+ * @param path\r
+ */\r
+ public void setPath(GeneralPath path)\r
+ {\r
+ Rectangle2D bounds = path.getBounds2D();\r
+ PathIterator it = path.getPathIterator(new AffineTransform());\r
+\r
+ ArrayList segInfo = new ArrayList();\r
+ ArrayList pntInfo = new ArrayList();\r
+ boolean isClosed = false;\r
+ while (!it.isDone()) {\r
+ double[] vals = new double[6];\r
+ int type = it.currentSegment(vals);\r
+ switch (type) {\r
+ case PathIterator.SEG_MOVETO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ segInfo.add(new byte[]{0x00, 0x40});\r
+ break;\r
+ case PathIterator.SEG_LINETO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, 0x00 });\r
+ break;\r
+ case PathIterator.SEG_CUBICTO:\r
+ pntInfo.add(new Point2D.Double(vals[0], vals[1]));\r
+ pntInfo.add(new Point2D.Double(vals[2], vals[3]));\r
+ pntInfo.add(new Point2D.Double(vals[4], vals[5]));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAD});\r
+ segInfo.add(new byte[]{0x01, 0x20 });\r
+ break;\r
+ case PathIterator.SEG_QUADTO:\r
+ System.err.println("SEG_QUADTO is not supported");\r
+ break;\r
+ case PathIterator.SEG_CLOSE:\r
+ pntInfo.add(pntInfo.get(0));\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, 0x00 });\r
+ segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x01, (byte)0x60});\r
+ isClosed = true;\r
+ break;\r
+ }\r
+\r
+ it.next();\r
+ }\r
+ if(!isClosed) segInfo.add(new byte[]{0x00, (byte)0xAC});\r
+ segInfo.add(new byte[]{0x00, (byte)0x80});\r
+\r
+ EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__SHAPEPATH, 0x4));\r
+\r
+ EscherArrayProperty verticesProp = new EscherArrayProperty((short)(EscherProperties.GEOMETRY__VERTICES + 0x4000), false, null);\r
+ verticesProp.setNumberOfElementsInArray(pntInfo.size());\r
+ verticesProp.setNumberOfElementsInMemory(pntInfo.size());\r
+ verticesProp.setSizeOfElements(0xFFF0);\r
+ for (int i = 0; i < pntInfo.size(); i++) {\r
+ Point2D.Double pnt = (Point2D.Double)pntInfo.get(i);\r
+ byte[] data = new byte[4];\r
+ LittleEndian.putShort(data, 0, (short)((pnt.getX() - bounds.getX())*MASTER_DPI/POINT_DPI));\r
+ LittleEndian.putShort(data, 2, (short)((pnt.getY() - bounds.getY())*MASTER_DPI/POINT_DPI));\r
+ verticesProp.setElement(i, data);\r
+ }\r
+ opt.addEscherProperty(verticesProp);\r
+\r
+ EscherArrayProperty segmentsProp = new EscherArrayProperty((short)(EscherProperties.GEOMETRY__SEGMENTINFO + 0x4000), false, null);\r
+ segmentsProp.setNumberOfElementsInArray(segInfo.size());\r
+ segmentsProp.setNumberOfElementsInMemory(segInfo.size());\r
+ segmentsProp.setSizeOfElements(0x2);\r
+ for (int i = 0; i < segInfo.size(); i++) {\r
+ byte[] seg = (byte[])segInfo.get(i);\r
+ segmentsProp.setElement(i, seg);\r
+ }\r
+ opt.addEscherProperty(segmentsProp);\r
+\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__RIGHT, (int)(bounds.getWidth()*MASTER_DPI/POINT_DPI)));\r
+ opt.addEscherProperty(new EscherSimpleProperty(EscherProperties.GEOMETRY__BOTTOM, (int)(bounds.getHeight()*MASTER_DPI/POINT_DPI)));\r
+\r
+ opt.sortProperties();\r
+\r
+ setAnchor(bounds);\r
+ }\r
+}\r
private Color background;
private RenderingHints hints;
- /**
- * the maximum distance that the line segments used to approximate the curved segments
- */
- public static final float FLATNESS = 0.1f;
-
/**
* Construct Java Graphics object which translates graphic calls in ppt drawing layer.
*
* @see #setComposite
*/
public void draw(Shape shape){
-
- PathIterator it = shape.getPathIterator(transform, FLATNESS);
- double[] prev = null;
- double[] coords = new double[6];
- double[] first = new double[6];
- if(!it.isDone()) it.currentSegment(first); //first point
- while(!it.isDone()){
- int type = it.currentSegment(coords);
- if (prev != null ){
- Line line = new Line(group);
- applyPaint(line);
- applyStroke(line);
- if (type == PathIterator.SEG_LINETO) {
- line.setAnchor(new Rectangle2D.Double(prev[0], prev[1], (coords[0] - prev[0]), (coords[1] - prev[1])));
- } else if (type == PathIterator.SEG_CLOSE){
- line.setAnchor(new Rectangle2D.Double(coords[0], coords[1], (first[0] - coords[0]), (first[1] - coords[1])));
- }
- group.addShape(line);
- }
- prev = new double[]{coords[0], coords[1]};
- it.next();
- }
-
+ GeneralPath path = new GeneralPath(transform.createTransformedShape(shape));
+ Freeform p = new Freeform(group);
+ p.setPath(path);
+ p.getFill().setForegroundColor(null);
+ applyStroke(p);
+ group.addShape(p);
}
/**
* Even if top and bottom margins are set to 0 PowerPoint
* always sets extra space between the text and its bounding box.
*
- * Approximation height = ascent*2 works good enough in most cases
+ * The approximation height = ascent*2 works good enough in most cases
*/
float height = ascent * 2;
* @see #setClip
*/
public void fill(Shape shape){
- PathIterator it = shape.getPathIterator(transform, FLATNESS);
- ArrayList pnt = new ArrayList();
- double[] coords = new double[6];
- while(!it.isDone()){
- int type = it.currentSegment(coords);
- if (type != PathIterator.SEG_CLOSE) {
- pnt.add(new Point2D.Double(coords[0], coords[1]));
- }
- it.next();
- }
- if(pnt.size() > 0){
- Point2D[] points = (Point2D[])pnt.toArray(new Point2D[pnt.size()]);
- Polygon p = new Polygon(group);
- p.setPoints(points);
- applyPaint(p);
-
- p.setLineColor(null); //Fills must be "No Line"
-
- Rectangle2D bounds = transform.createTransformedShape(shape).getBounds2D();
- p.setAnchor(bounds);
- group.addShape(p);
- }
+ GeneralPath path = new GeneralPath(transform.createTransformedShape(shape));
+ Freeform p = new Freeform(group);
+ p.setPath(path);
+ applyPaint(p);
+ p.setLineColor(null); //Fills must be "No Line"
+ group.addShape(p);
}
/**
*/
public void drawRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight){
- AutoShape shape = new AutoShape(ShapeTypes.RoundRectangle, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
+ draw(rect);
}
/**
* @see java.awt.Graphics#drawOval
*/
public void fillOval(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Ellipse, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
+ fill(oval);
}
/**
*/
public void fillRoundRect(int x, int y, int width, int height,
int arcWidth, int arcHeight){
- AutoShape shape = new AutoShape(ShapeTypes.RoundRectangle, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+
+ RoundRectangle2D rect = new RoundRectangle2D.Float(x, y, width, height, arcWidth, arcHeight);
+ fill(rect);
}
/**
*/
public void fillArc(int x, int y, int width, int height,
int startAngle, int arcAngle){
- AutoShape shape = new AutoShape(ShapeTypes.Arc, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.PIE);
+ fill(arc);
}
/**
*/
public void drawArc(int x, int y, int width, int height,
int startAngle, int arcAngle) {
- AutoShape shape = new AutoShape(ShapeTypes.Arc, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Arc2D arc = new Arc2D.Float(x, y, width, height, startAngle, arcAngle, Arc2D.OPEN);
+ draw(arc);
}
* @see java.awt.Graphics#fillOval
*/
public void drawOval(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Ellipse, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Ellipse2D oval = new Ellipse2D.Float(x, y, width, height);
+ draw(oval);
}
/**
* @see java.awt.Graphics#drawRect
*/
public void fillRect(int x, int y, int width, int height){
- AutoShape shape = new AutoShape(ShapeTypes.Rectangle, group);
- applyPaint(shape);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
+ Rectangle rect = new Rectangle(x, y, width, height);
+ fill(rect);
}
/**
* @see java.awt.Graphics#clearRect
*/
public void drawRect(int x, int y, int width, int height) {
- AutoShape shape = new AutoShape(ShapeTypes.Rectangle, group);
- shape.setFillColor(null);
- applyStroke(shape);
- shape.setAnchor(new Rectangle2D.Double(x, y, width, height));
- group.addShape(shape);
-
+ Rectangle rect = new Rectangle(x, y, width, height);
+ draw(rect);
}
/**
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.record.Document;
import org.apache.poi.hslf.blip.Bitmap;
-import org.apache.poi.util.POILogger;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
List lst = bstore.getChildRecords();
int idx = getPictureIndex();
if (idx == 0){
- logger.log(POILogger.ERROR, "no reference to picture data found ");
+ log.error("no reference to picture data found ");
} else {
EscherBSERecord bse = (EscherBSERecord)lst.get(idx-1);
for ( int i = 0; i < pict.length; i++ ) {
return pict[i];
}
}
- logger.log(POILogger.ERROR, "no picture found for our BSE offset " + bse.getOffset());
+ log.error("no picture found for our BSE offset " + bse.getOffset());
}
return null;
}
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.model.ShapeTypes;
import org.apache.poi.hslf.record.ColorSchemeAtom;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import java.util.Iterator;
import java.awt.*;
public abstract class Shape {
// For logging
- protected POILogger logger = POILogFactory.getLogger(this.getClass());
+ protected Log log = LogFactory.getLog(this.getClass());
/**
* In Escher absolute distances are specified in
*/
protected Sheet _sheet;
+ /**
+ * Fill
+ */
+ protected Fill _fill;
+
/**
* Create a Shape object. This constructor is used when an existing Shape is read from from a PowerPoint document.
*
* @return fill properties of this shape
*/
public Fill getFill(){
- return new Fill(this);
+ if(_fill == null) _fill = new Fill(this);
+ return _fill;
}
import org.apache.poi.ddf.*;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
import java.util.ArrayList;
import java.util.List;
} else {
// Should we do anything special with these non
// Container records?
- logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
+ log.error("Shape contained non container escher record, was " + r.getClass().getName());
}
}
* The color used to fill this shape.
*/
public Color getFillColor(){
- EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);
- EscherSimpleProperty p1 = (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.FILL__FILLCOLOR);
- EscherSimpleProperty p2= (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
-
- int p2val = p2 == null ? 0 : p2.getPropertyValue();
-
- Color clr = null;
- if (p1 != null && (p2val & 0x10) != 0){
- int rgb = p1.getPropertyValue();
- if (rgb >= 0x8000000) {
- int idx = rgb % 0x8000000;
- if(getSheet() != null) {
- ColorSchemeAtom ca = getSheet().getColorScheme();
- rgb = ca.getColor(idx);
- }
- }
- Color tmp = new Color(rgb, true);
- clr = new Color(tmp.getBlue(), tmp.getGreen(), tmp.getRed());
- }
- return clr;
+ return getFill().getForegroundColor();
}
/**
* @param color the background color
*/
public void setFillColor(Color color){
- EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);
- if(color == null) {
- setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
- } else {
- int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
- setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb);
- setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011);
- }
+ getFill().setForegroundColor(color);
}
}
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.exceptions.HSLFException;
-import org.apache.poi.util.POILogger;
import java.awt.*;
import java.awt.font.FontRenderContext;
}
}
if(_txtrun == null) {
- logger.log(POILogger.WARN, "text run not found for OutlineTextRefAtom.TextIndex=" + idx);
+ log.warn("text run not found for OutlineTextRefAtom.TextIndex=" + idx);
}
} else {
int shapeId = _escherContainer.getChildById(EscherSpRecord.RECORD_ID).getShapeId();
package org.apache.poi.hslf.record;
-import org.apache.poi.util.POILogger;
-
import java.io.IOException;
import java.io.OutputStream;
// (normally it's 2, or 3 if you have notes)
// Complain if it's not
if(slwtcount == 0) {
- logger.log(POILogger.WARN, "No SlideListWithText's found - there should normally be at least one!");
+ logger.warn("No SlideListWithText's found - there should normally be at least one!");
}
if(slwtcount > 3) {
- logger.log(POILogger.WARN, "Found " + slwtcount + " SlideListWithTexts - normally there should only be three!");
+ logger.warn("Found " + slwtcount + " SlideListWithTexts - normally there should only be three!");
}
// Now grab all the SLWTs
import java.io.IOException;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
/**
* This data represents an embedded object in the document.
if(_children[0] instanceof ExEmbedAtom) {
embedAtom = (ExEmbedAtom)_children[0];
} else {
- logger.log(POILogger.ERROR, "First child record wasn't a ExEmbedAtom, was of type " + _children[0].getRecordType());
+ logger.error("First child record wasn't a ExEmbedAtom, was of type " + _children[0].getRecordType());
}
// Second child should be the ExOleObjAtom
if (_children[1] instanceof ExOleObjAtom) {
oleObjAtom = (ExOleObjAtom)_children[1];
} else {
- logger.log(POILogger.ERROR, "Second child record wasn't a ExOleObjAtom, was of type " + _children[1].getRecordType());
+ logger.error("Second child record wasn't a ExOleObjAtom, was of type " + _children[1].getRecordType());
}
for (int i = 2; i < _children.length; i++) {
else if (progId == null) progId = (CString)_children[i];
else if (clipboardName == null) clipboardName = (CString)_children[i];
} else {
- logger.log(POILogger.ERROR, "Record after atoms wasn't a CString, was of type " + _children[i].getRecordType());
+ logger.error("Record after atoms wasn't a CString, was of type " + _children[i].getRecordType());
}
}
}
/**
- * Gets the {@code ExEmbedAtom}.
+ * Gets the {@link ExEmbedAtom}.
*
- * @return the {@code ExEmbedAtom}.
+ * @return the {@link ExEmbedAtom}.
*/
public ExEmbedAtom getExEmbedAtom()
{
}
/**
- * Gets the {@code ExOleObjAtom}.
+ * Gets the {@link ExOleObjAtom}.
*
- * @return the {@code ExOleObjAtom}.
+ * @return the {@link ExOleObjAtom}.
*/
public ExOleObjAtom getExOleObjAtom()
{
import java.io.OutputStream;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
/**
* This class represents the data of a link in the document.
if(_children[0] instanceof ExHyperlinkAtom) {
linkAtom = (ExHyperlinkAtom)_children[0];
} else {
- logger.log(POILogger.ERROR, "First child record wasn't a ExHyperlinkAtom, was of type " + _children[0].getRecordType());
+ logger.error("First child record wasn't a ExHyperlinkAtom, was of type " + _children[0].getRecordType());
}
for (int i = 1; i < _children.length; i++) {
if ( linkDetailsA == null) linkDetailsA = (CString)_children[i];
else linkDetailsB = (CString)_children[i];
} else {
- logger.log(POILogger.ERROR, "Record after ExHyperlinkAtom wasn't a CString, was of type " + _children[1].getRecordType());
+ logger.error("Record after ExHyperlinkAtom wasn't a CString, was of type " + _children[1].getRecordType());
}
}
package org.apache.poi.hslf.record;
-import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
-
import java.io.*;
import java.util.*;
FontEntityAtom atom = (FontEntityAtom)_children[i];
fonts.add(atom.getFontName());
} else {
- logger.log(POILogger.WARN, "Warning: FontCollection child wasn't a FontEntityAtom, was " + _children[i]);
+ logger.warn("Warning: FontCollection child wasn't a FontEntityAtom, was " + _children[i]);
}
}
}
package org.apache.poi.hslf.record;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.model.ShapeTypes;
// Wind on
int size = r.getRecordSize();
if(size < 8) {
- logger.log(POILogger.WARN, "Hit short DDF record at " + startPos + " - " + size);
+ logger.warn("Hit short DDF record at " + startPos + " - " + size);
}
/**
* Sometimes it is not so, see an example in bug #44770. Most likely reason is that one of ddf records calculates wrong size.
*/
if(size != escherBytes){
- logger.log(POILogger.WARN, "Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass());
+ logger.warn("Record length=" + escherBytes + " but getRecordSize() returned " + r.getRecordSize() + "; record: " + r.getClass());
size = escherBytes;
}
startPos += size;
package org.apache.poi.hslf.record;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
import java.io.IOException;
import java.io.OutputStream;
Integer newPos = (Integer)oldToNewReferencesLookup.get(oldPos);
if(newPos == null) {
- logger.log(POILogger.WARN, "Couldn't find the new location of the \"slide\" with id " + id + " that used to be at " + oldPos);
- logger.log(POILogger.WARN, "Not updating the position of it, you probably won't be able to find it any more (if you ever could!)");
+ logger.warn("Couldn't find the new location of the \"slide\" with id " + id + " that used to be at " + oldPos);
+ logger.warn("Not updating the position of it, you probably won't be able to find it any more (if you ever could!)");
newPos = oldPos;
}
import java.io.OutputStream;
import java.util.Vector;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
public abstract class Record
{
// For logging
- protected POILogger logger = POILogFactory.getLogger(this.getClass());
+ protected Log logger = LogFactory.getLog(this.getClass());
/**
* Is this record type an Atom record (only has data),
import org.apache.poi.hslf.model.textproperties.TextProp;
import org.apache.poi.hslf.model.textproperties.TextPropCollection;
import org.apache.poi.util.LittleEndian;
-import org.apache.poi.util.POILogger;
/**
* A StyleTextPropAtom (type 4001). Holds basic character properties
}
if (rawContents.length > 0 && textHandled != (size+1)){
- logger.log(POILogger.WARN, "Problem reading paragraph style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
+ logger.warn("Problem reading paragraph style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
}
// Now do the character stylings
}
}
if (rawContents.length > 0 && textHandled != (size+1)){
- logger.log(POILogger.WARN, "Problem reading character style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
+ logger.warn("Problem reading character style runs: textHandled = " + textHandled + ", text.size+1 = " + (size+1));
}
// Handle anything left over
import org.apache.poi.hslf.exceptions.CorruptPowerPointFileException;
import org.apache.poi.hslf.exceptions.HSLFException;
import org.apache.poi.util.ArrayUtil;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.util.POILogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
/**
* This class is a friendly wrapper on top of the more scary HSLFSlideShow.
private FontCollection _fonts;
// For logging
- private POILogger logger = POILogFactory.getLogger(this.getClass());
+ private static final Log logger = LogFactory.getLog(SlideShow.class);
/* ===============================================================
Record r = _mostRecentCoreRecords[coreRecordId.intValue()];
return r;
} else {
- logger.log(POILogger.ERROR, "We tried to look up a reference to a core record, but there was no core ID for reference ID " + refID);
+ logger.error("We tried to look up a reference to a core record, but there was no core ID for reference ID " + refID);
return null;
}
}
Integer slideId = new Integer(spa.getSlideIdentifier());
slideIdToNotes.put(slideId, new Integer(i));
} else {
- logger.log(POILogger.ERROR, "A Notes SlideAtomSet at " + i + " said its record was at refID " + notesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+ logger.error("A Notes SlideAtomSet at " + i + " said its record was at refID " + notesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
}
}
notesRecords = new org.apache.poi.hslf.record.Notes[notesRecordsL.size()];
if(r instanceof org.apache.poi.hslf.record.Slide) {
slidesRecords[i] = (org.apache.poi.hslf.record.Slide)r;
} else {
- logger.log(POILogger.ERROR, "A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
+ logger.error("A Slide SlideAtomSet at " + i + " said its record was at refID " + slidesSets[i].getSlidePersistAtom().getRefID() + ", but that was actually a " + r);
}
}
}
if (noteId != 0){
Integer notesPos = (Integer)slideIdToNotes.get(new Integer(noteId));
if (notesPos != null) notes = _notes[notesPos.intValue()];
- else logger.log(POILogger.ERROR, "Notes not found for noteId=" + noteId);
+ else logger.error("Notes not found for noteId=" + noteId);
}
// Now, build our slide
System.arraycopy(_slides, 0, s, 0, _slides.length);
s[_slides.length] = slide;
_slides = s;
- logger.log(POILogger.INFO, "Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
+ logger.info("Added slide " + _slides.length + " with ref " + sp.getRefID() + " and identifier " + sp.getSlideIdentifier());
// Add the core records for this new Slide to the record tree
org.apache.poi.hslf.record.Slide slideRecord = slide.getSlideRecord();
// (Also need to tell it where it is)
slideRecord.setLastOnDiskOffset(slideOffset);
ptr.addSlideLookup(sp.getRefID(), slideOffset);
- logger.log(POILogger.INFO, "New slide ended up at " + slideOffset);
+ logger.info("New slide ended up at " + slideOffset);
// Last view is now of the slide
usr.setLastViewType((short)UserEditAtom.LAST_VIEW_SLIDE_VIEW);
group = (ShapeGroup)shape[0];
shape = group.getShapes();
- assertEquals(shape.length, 7);
+ assertEquals(shape.length, 3);
}
}