From 326486c891ee5d3c1e17e9680af0d769c55c5cc9 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 14 Sep 2010 18:50:10 +0000 Subject: [PATCH] Various XWPF picture tweaks and more unit tests Note that XWPFRun -> XWPFPicture currently only works with the full ooxml schemas file, and not with poi-ooxml-schemas, due to some sort of missing resources around the namespace switch git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@997037 13f79535-47bb-0310-9956-ffa450edef68 --- .../java/org/apache/poi/util/OOXMLLite.java | 7 +- .../poi/xwpf/usermodel/XWPFPictureData.java | 14 +++- .../apache/poi/xwpf/usermodel/XWPFRun.java | 6 +- .../poi/xwpf/usermodel/TestXWPFParagraph.java | 73 ++++++++++++++++++- 4 files changed, 91 insertions(+), 9 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/util/OOXMLLite.java b/src/ooxml/java/org/apache/poi/util/OOXMLLite.java index b0e7b26dc4..cb0a755ee3 100644 --- a/src/ooxml/java/org/apache/poi/util/OOXMLLite.java +++ b/src/ooxml/java/org/apache/poi/util/OOXMLLite.java @@ -129,10 +129,9 @@ public final class OOXMLLite { JarFile jar = new JarFile(_ooxmlJar); for(Enumeration e = jar.entries(); e.hasMoreElements(); ){ JarEntry je = e.nextElement(); - if(je.getName().matches("schemaorg_apache_xmlbeans/system/\\w+/\\w+\\.xsb")){ - File destFile = new File(_destDest, je.getName()); - //System.out.println(je.getName() + " --> " + destFile); - copyFile(jar.getInputStream(je), destFile); + if(je.getName().matches("schemaorg_apache_xmlbeans/system/\\w+/\\w+\\.xsb")) { + File destFile = new File(_destDest, je.getName()); + copyFile(jar.getInputStream(je), destFile); } } jar.close(); diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java index 5094763f73..ecae82b3fa 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPictureData.java @@ -92,6 +92,18 @@ public class XWPFPictureData extends POIXMLDocumentPart { return null; } + /** + * Returns the file name of the image, eg image7.jpg . + * The original filename isn't always available, but if it + * can be found it's likely to be in the CTDrawing + */ + public String getFileName() { + String name = getPackagePart().getPartName().getName(); + if(name == null) + return null; + return name.substring(name.lastIndexOf('/') + 1); + } + /** * Suggests a file extension for this image. * @@ -123,6 +135,4 @@ public class XWPFPictureData extends POIXMLDocumentPart { } return 0; } - - } diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java index a72a0c7602..4f9a68b2b4 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java @@ -26,6 +26,7 @@ import org.apache.poi.util.Internal; import org.apache.xmlbeans.XmlCursor; import org.apache.xmlbeans.XmlObject; import org.apache.xmlbeans.XmlString; +import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTEmpty; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; @@ -94,9 +95,10 @@ public class XWPFRun { .selectPath("declare namespace pic='http://schemas.openxmlformats.org/drawingml/2006/picture' .//pic:pic"); for(XmlObject pict : picts) { if(pict instanceof org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture) { - pictures.add(new XWPFPicture( + XWPFPicture picture = new XWPFPicture( (org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture)pict, p - )); + ); + pictures.add(picture); } } } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java index 5abc6a2005..6bf3c03ff0 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java @@ -38,6 +38,9 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STJc; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STLineSpacingRule; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTextAlignment; +import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture; +import org.openxmlformats.schemas.drawingml.x2006.picture.PicDocument; +import org.openxmlformats.schemas.drawingml.x2006.picture.impl.PicDocumentImpl; /** * Tests for XWPF Paragraphs @@ -250,6 +253,74 @@ public final class TestXWPFParagraph extends TestCase { } public void testPictures() throws Exception { - // TODO + XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("VariousPictures.docx"); + assertEquals(7, doc.getParagraphs().size()); + + XWPFParagraph p; + XWPFRun r; + + // Text paragraphs + assertEquals("Sheet with various pictures", doc.getParagraphs().get(0).getText()); + assertEquals("(jpeg, png, wmf, emf and pict) ", doc.getParagraphs().get(1).getText()); + + // Spacer ones + assertEquals("", doc.getParagraphs().get(2).getText()); + assertEquals("", doc.getParagraphs().get(3).getText()); + assertEquals("", doc.getParagraphs().get(4).getText()); + + // Image one + p = doc.getParagraphs().get(5); + assertEquals(6, p.getRuns().size()); + + r = p.getRuns().get(0); + assertEquals("", r.toString()); + assertEquals(1, r.getEmbeddedPictures().size()); + assertNotNull(r.getEmbeddedPictures().get(0).getPictureData()); + assertEquals("image1.wmf", r.getEmbeddedPictures().get(0).getPictureData().getFileName()); + + r = p.getRuns().get(1); + assertEquals("", r.toString()); + assertEquals(1, r.getEmbeddedPictures().size()); + assertNotNull(r.getEmbeddedPictures().get(0).getPictureData()); + assertEquals("image2.png", r.getEmbeddedPictures().get(0).getPictureData().getFileName()); + + r = p.getRuns().get(2); + assertEquals("", r.toString()); + assertEquals(1, r.getEmbeddedPictures().size()); + assertNotNull(r.getEmbeddedPictures().get(0).getPictureData()); + assertEquals("image3.emf", r.getEmbeddedPictures().get(0).getPictureData().getFileName()); + + r = p.getRuns().get(3); + assertEquals("", r.toString()); + assertEquals(1, r.getEmbeddedPictures().size()); + assertNotNull(r.getEmbeddedPictures().get(0).getPictureData()); + assertEquals("image4.emf", r.getEmbeddedPictures().get(0).getPictureData().getFileName()); + + r = p.getRuns().get(4); + assertEquals("", r.toString()); + assertEquals(1, r.getEmbeddedPictures().size()); + assertNotNull(r.getEmbeddedPictures().get(0).getPictureData()); + assertEquals("image5.jpeg", r.getEmbeddedPictures().get(0).getPictureData().getFileName()); + + r = p.getRuns().get(5); + assertEquals(" ", r.toString()); + assertEquals(0, r.getEmbeddedPictures().size()); + + // Final spacer + assertEquals("", doc.getParagraphs().get(6).getText()); + + + // Look in detail at one + r = p.getRuns().get(4); + XWPFPicture pict = r.getEmbeddedPictures().get(0); + CTPicture picture = pict.getCTPicture(); + assertEquals("rId8", picture.getBlipFill().getBlip().getEmbed()); + + // Ensure that the ooxml compiler finds everything we need + r.getCTR().getDrawingArray(0); + r.getCTR().getDrawingArray(0).getInlineArray(0); + r.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic(); + r.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic().getGraphicData(); + PicDocument pd = new PicDocumentImpl(null); } } -- 2.39.5