]> source.dussan.org Git - poi.git/commitdiff
#58237 When adding a picture to a XWPF header or footer, attach it to the right part
authorNick Burch <nick@apache.org>
Thu, 13 Aug 2015 20:23:58 +0000 (20:23 +0000)
committerNick Burch <nick@apache.org>
Thu, 13 Aug 2015 20:23:58 +0000 (20:23 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1695772 13f79535-47bb-0310-9956-ffa450edef68

src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java

index 4a381de9eb9012e2ef9ec42b8d3a79bfcf7351fc..8c0d2e63f48fb646f209bd107943ed0eb3f3c38e 100644 (file)
@@ -166,7 +166,9 @@ public class XWPFHeaderFooterPolicy {
         String pStyle = "Header";
         int i = getRelationIndex(relation);
         HdrDocument hdrDoc = HdrDocument.Factory.newInstance();
+        
         XWPFHeader wrapper = (XWPFHeader) doc.createRelationship(relation, XWPFFactory.getInstance(), i);
+        wrapper.setXWPFDocument(doc);
 
         CTHdrFtr hdr = buildHdr(type, pStyle, wrapper, pars);
         wrapper.setHeaderFooter(hdr);
@@ -201,7 +203,9 @@ public class XWPFHeaderFooterPolicy {
         String pStyle = "Footer";
         int i = getRelationIndex(relation);
         FtrDocument ftrDoc = FtrDocument.Factory.newInstance();
+        
         XWPFFooter wrapper = (XWPFFooter) doc.createRelationship(relation, XWPFFactory.getInstance(), i);
+        wrapper.setXWPFDocument(doc);
 
         CTHdrFtr ftr = buildFtr(type, pStyle, wrapper, pars);
         wrapper.setHeaderFooter(ftr);
index 1c14bb274a9f31cde4f8f56a366e5f8e18be3ba3..b5e465dcb77e68862bc3a70b82214f46bc86fafd 100644 (file)
@@ -915,12 +915,22 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun {
      * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_DIB\r
      */\r
     public XWPFPicture addPicture(InputStream pictureData, int pictureType, String filename, int width, int height)\r
-            throws InvalidFormatException, IOException {\r
-        XWPFDocument doc = parent.getDocument();\r
-\r
-        // Add the picture + relationship\r
-        String relationId = doc.addPictureData(pictureData, pictureType);
-        XWPFPictureData picData = (XWPFPictureData) doc.getRelationById(relationId);
+            throws InvalidFormatException, IOException {
+        String relationId;
+        XWPFPictureData picData;
+        
+        // Work out what to add the picture to, then add both the
+        //  picture and the relationship for it
+        // TODO Should we have an interface for this sort of thing?
+        if (parent.getPart() instanceof XWPFHeaderFooter) {
+            XWPFHeaderFooter headerFooter = (XWPFHeaderFooter)parent.getPart();
+            relationId = headerFooter.addPictureData(pictureData, pictureType);
+            picData = (XWPFPictureData) headerFooter.getRelationById(relationId);
+        } else {
+            XWPFDocument doc = parent.getDocument();
+            relationId = doc.addPictureData(pictureData, pictureType);
+            picData = (XWPFPictureData) doc.getRelationById(relationId);
+        }
 
         // Create the drawing entry for it
         try {
index 0b29956c67ab9f472a354b0de670c1f8dc88381b..02ab71adcfc8f89ba573ffad75a08cda1eac1158 100644 (file)
@@ -30,7 +30,6 @@ import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.xssf.usermodel.XSSFRelation;
 import org.apache.poi.xwpf.XWPFTestDataSamples;
 import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
-import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
 
 public class TestXWPFPictureData extends TestCase {
 
@@ -64,7 +63,7 @@ public class TestXWPFPictureData extends TestCase {
         verifyOneHeaderPicture(readBack);
     }
     
-    public void FIXMEtestCreateHeaderPicture() throws Exception { // TODO Fix
+    public void testCreateHeaderPicture() throws Exception {
         XWPFDocument doc = new XWPFDocument();
         
         // Starts with no header
@@ -73,16 +72,13 @@ public class TestXWPFPictureData extends TestCase {
         
         // Add a default header
         policy = doc.createHeaderFooterPolicy();
-        
-        XWPFParagraph[] hparas = new XWPFParagraph[] {
-                new XWPFParagraph(CTP.Factory.newInstance(), doc)
-        };
-        hparas[0].createRun().setText("Header Hello World!");
-        XWPFHeader header = policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT, hparas);
+        XWPFHeader header = policy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
+        header.getParagraphs().get(0).createRun().setText("Hello, Header World!");
+        header.createParagraph().createRun().setText("Paragraph 2");
         assertEquals(0, header.getAllPictures().size());
-        assertEquals(1, header.getParagraphs().size());
+        assertEquals(2, header.getParagraphs().size());
         
-        // Add a picture to it
+        // Add a picture to the first paragraph
         header.getParagraphs().get(0).getRuns().get(0).addPicture(
                 new ByteArrayInputStream(new byte[] {1,2,3,4}), 
                 Document.PICTURE_TYPE_JPEG, "test.jpg", 2, 2);