From 71b9455d886a52c7f0e1816a0a2e940ebf0a4f6a Mon Sep 17 00:00:00 2001 From: Maxim Valyanskiy Date: Mon, 21 Mar 2011 12:43:58 +0000 Subject: [PATCH] XWPF: support for pictures in headers git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1083764 13f79535-47bb-0310-9956-ffa450edef68 --- .../xwpf/model/XWPFHeaderFooterPolicy.java | 11 +++++--- .../apache/poi/xwpf/usermodel/XWPFHeader.java | 1 - .../poi/xwpf/usermodel/XWPFPicture.java | 2 +- .../poi/xwpf/usermodel/TestXWPFHeader.java | 16 +++++++---- .../xwpf/usermodel/TestXWPFPictureData.java | 11 ++++++++ .../poi/xwpf/usermodel/TestXWPFRun.java | 25 ++++++++++++++++++ test-data/document/headerPic.docx | Bin 0 -> 16206 bytes 7 files changed, 56 insertions(+), 10 deletions(-) create mode 100644 test-data/document/headerPic.docx diff --git a/src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java b/src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java index 3a5b77effd..65020e6935 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java +++ b/src/ooxml/java/org/apache/poi/xwpf/model/XWPFHeaderFooterPolicy.java @@ -107,9 +107,14 @@ public class XWPFHeaderFooterPolicy { // Get the header CTHdrFtrRef ref = sectPr.getHeaderReferenceArray(i); PackagePart hdrPart = doc.getPartById(ref.getId()); - HdrDocument hdrDoc = HdrDocument.Factory.parse(hdrPart.getInputStream()); - CTHdrFtr hdrFtr = hdrDoc.getHdr(); - XWPFHeader hdr = new XWPFHeader(doc, hdrFtr); + + XWPFHeader hdr = null; + + for (POIXMLDocumentPart part : doc.getRelations()) { + if (part.getPackagePart().getPartName().equals(hdrPart.getPartName())) { + hdr = (XWPFHeader) part; + } + } // Assign it Enum type = ref.getType(); diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java index 07f59afffe..6ccbf46241 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFHeader.java @@ -133,7 +133,6 @@ public class XWPFHeader extends XWPFHeaderFooter { } } cursor.dispose(); - getAllPictures(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java index eaeb780720..9f0a49f24b 100644 --- a/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java +++ b/src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java @@ -64,7 +64,7 @@ public class XWPFPicture { */ public XWPFPictureData getPictureData(){ String blipId = ctPic.getBlipFill().getBlip().getEmbed(); - for(POIXMLDocumentPart part: paragraph.getDocument().getRelations()){ + for(POIXMLDocumentPart part: ((POIXMLDocumentPart) paragraph.getPart()).getRelations()){ if(part.getPackageRelationship().getId().equals(blipId)){ return (XWPFPictureData)part; } diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFHeader.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFHeader.java index b46f8d32ac..738ca7af13 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFHeader.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFHeader.java @@ -34,17 +34,23 @@ public final class TestXWPFHeader extends TestCase { XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); - XWPFHeader header = policy.getDefaultHeader(); XWPFFooter footer = policy.getDefaultFooter(); assertNotNull(header); assertNotNull(footer); - - // TODO verify if the following is correct - assertNull(header.toString()); - } + public void testImageInHeader() { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); + + XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); + + XWPFHeader header = policy.getDefaultHeader(); + + assertNotNull(header.getRelations()); + assertEquals(1, header.getRelations().size()); + } + public void testSetHeader() throws IOException { XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("SampleDoc.docx"); // no header is set (yet) diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java index b17af3644c..c05e6201e1 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFPictureData.java @@ -26,6 +26,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 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; public class TestXWPFPictureData extends TestCase { public void testRead(){ @@ -58,6 +59,16 @@ public class TestXWPFPictureData extends TestCase { } } + public void testPictureInHeader() { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); + XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); + + XWPFHeader header = policy.getDefaultHeader(); + + List pictures = header.getAllPictures(); + assertEquals(1, pictures.size()); + } + public void testNew() throws Exception { XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("EmptyDocumentWithHeaderFooter.docx"); byte[] jpegData = "test jpeg data".getBytes(); diff --git a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java index 695f936a58..dd0cad864a 100644 --- a/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java +++ b/src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFRun.java @@ -17,10 +17,12 @@ package org.apache.poi.xwpf.usermodel; import java.math.BigInteger; +import java.util.List; import junit.framework.TestCase; import org.apache.poi.xwpf.XWPFTestDataSamples; +import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr; @@ -326,4 +328,27 @@ public class TestXWPFRun extends TestCase { assertEquals(false, run.isStrike()); assertEquals(null, run.getCTR().getRPr()); } + + public void testPictureInHeader() { + XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); + XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); + + XWPFHeader header = policy.getDefaultHeader(); + + int count = 0; + + for (XWPFParagraph p : header.getParagraphs()) { + for (XWPFRun r : p.getRuns()) { + List pictures = r.getEmbeddedPictures(); + + for (XWPFPicture pic : pictures) { + assertNotNull(pic.getPictureData()); + } + + count+= pictures.size(); + } + } + + assertEquals(1, count); + } } diff --git a/test-data/document/headerPic.docx b/test-data/document/headerPic.docx new file mode 100644 index 0000000000000000000000000000000000000000..01072e547e44e8dc1b7364ecae20d888a116ad3f GIT binary patch literal 16206 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 A-~a#s literal 0 HcmV?d00001