| /* ==================================================================== |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| ==================================================================== */ |
| |
| package org.apache.poi.xwpf.usermodel; |
| |
| import static org.junit.Assert.assertArrayEquals; |
| |
| import java.io.IOException; |
| import java.util.List; |
| |
| import junit.framework.TestCase; |
| |
| 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() throws InvalidFormatException, IOException |
| { |
| XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("VariousPictures.docx"); |
| List<XWPFPictureData> pictures = sampleDoc.getAllPictures(); |
| |
| assertEquals(5,pictures.size()); |
| String[] ext = {"wmf","png","emf","emf","jpeg"}; |
| for (int i = 0 ; i < pictures.size() ; i++) |
| { |
| assertEquals(ext[i],pictures.get(i).suggestFileExtension()); |
| } |
| |
| int num = pictures.size(); |
| |
| byte[] pictureData = XWPFTestDataSamples.getImage("nature1.jpg"); |
| |
| String relationId = sampleDoc.addPictureData(pictureData,XWPFDocument.PICTURE_TYPE_JPEG); |
| // picture list was updated |
| assertEquals(num + 1,pictures.size()); |
| XWPFPictureData pict = (XWPFPictureData) sampleDoc.getRelationById(relationId); |
| assertEquals("jpeg",pict.suggestFileExtension()); |
| assertArrayEquals(pictureData,pict.getData()); |
| } |
| |
| public void testPictureInHeader() throws IOException |
| { |
| XWPFDocument sampleDoc = XWPFTestDataSamples.openSampleDocument("headerPic.docx"); |
| verifyOneHeaderPicture(sampleDoc); |
| |
| XWPFDocument readBack = XWPFTestDataSamples.writeOutAndReadBack(sampleDoc); |
| verifyOneHeaderPicture(readBack); |
| } |
| |
| private void verifyOneHeaderPicture(XWPFDocument sampleDoc) { |
| XWPFHeaderFooterPolicy policy = sampleDoc.getHeaderFooterPolicy(); |
| |
| XWPFHeader header = policy.getDefaultHeader(); |
| |
| List<XWPFPictureData> pictures = header.getAllPictures(); |
| assertEquals(1,pictures.size()); |
| } |
| |
| public void testNew() throws InvalidFormatException, IOException |
| { |
| XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("EmptyDocumentWithHeaderFooter.docx"); |
| byte[] jpegData = XWPFTestDataSamples.getImage("nature1.jpg"); |
| assertNotNull(jpegData); |
| byte[] gifData = XWPFTestDataSamples.getImage("nature1.gif"); |
| assertNotNull(gifData); |
| byte[] pngData = XWPFTestDataSamples.getImage("nature1.png"); |
| assertNotNull(pngData); |
| |
| List<XWPFPictureData> pictures = doc.getAllPictures(); |
| assertEquals(0,pictures.size()); |
| |
| // Document shouldn't have any image relationships |
| assertEquals(13,doc.getPackagePart().getRelationships().size()); |
| for (PackageRelationship rel : doc.getPackagePart().getRelationships()) |
| { |
| if (rel.getRelationshipType().equals(XSSFRelation.IMAGE_JPEG.getRelation())) |
| { |
| fail("Shouldn't have JPEG yet"); |
| } |
| } |
| |
| // Add the image |
| String relationId = doc.addPictureData(jpegData,XWPFDocument.PICTURE_TYPE_JPEG); |
| assertEquals(1,pictures.size()); |
| XWPFPictureData jpgPicData = (XWPFPictureData) doc.getRelationById(relationId); |
| assertEquals("jpeg",jpgPicData.suggestFileExtension()); |
| assertArrayEquals(jpegData,jpgPicData.getData()); |
| |
| // Ensure it now has one |
| assertEquals(14,doc.getPackagePart().getRelationships().size()); |
| PackageRelationship jpegRel = null; |
| for (PackageRelationship rel : doc.getPackagePart().getRelationships()) |
| { |
| if (rel.getRelationshipType().equals(XWPFRelation.IMAGE_JPEG.getRelation())) |
| { |
| if (jpegRel != null) |
| fail("Found 2 jpegs!"); |
| jpegRel = rel; |
| } |
| } |
| assertNotNull("JPEG Relationship not found",jpegRel); |
| |
| // Check the details |
| assertNotNull(jpegRel); |
| assertEquals(XWPFRelation.IMAGE_JPEG.getRelation(),jpegRel.getRelationshipType()); |
| assertEquals("/word/document.xml",jpegRel.getSource().getPartName().toString()); |
| assertEquals("/word/media/image1.jpeg",jpegRel.getTargetURI().getPath()); |
| |
| XWPFPictureData pictureDataByID = doc.getPictureDataByID(jpegRel.getId()); |
| assertArrayEquals(jpegData, pictureDataByID.getData()); |
| |
| // Save an re-load, check it appears |
| doc = XWPFTestDataSamples.writeOutAndReadBack(doc); |
| assertEquals(1,doc.getAllPictures().size()); |
| assertEquals(1,doc.getAllPackagePictures().size()); |
| |
| // verify the picture that we read back in |
| pictureDataByID = doc.getPictureDataByID(jpegRel.getId()); |
| assertArrayEquals(jpegData, pictureDataByID.getData()); |
| |
| } |
| |
| public void testBug51770() throws InvalidFormatException, IOException { |
| XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("Bug51170.docx"); |
| XWPFHeaderFooterPolicy policy = doc.getHeaderFooterPolicy(); |
| XWPFHeader header = policy.getDefaultHeader(); |
| for (XWPFParagraph paragraph : header.getParagraphs()) { |
| for (XWPFRun run : paragraph.getRuns()) { |
| for (XWPFPicture picture : run.getEmbeddedPictures()) { |
| if (paragraph.getDocument() != null) { |
| //System.out.println(picture.getCTPicture()); |
| XWPFPictureData data = picture.getPictureData(); |
| if(data != null) System.out.println(data.getFileName()); |
| } |
| } |
| } |
| } |
| |
| } |
| } |