From: PJ Fanning Date: Thu, 21 Jul 2022 09:56:56 +0000 (+0000) Subject: add getPictureTypeEnum X-Git-Tag: REL_5_2_3~150 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=2a0c1b82c7c09b265a760e4ee9458ca4a89a20fb;p=poi.git add getPictureTypeEnum git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1902905 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java index 7459f83a82..caae274736 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFComments.java @@ -105,12 +105,29 @@ public class XWPFComments extends POIXMLDocumentPart { * obtained from {@link #getAllPictures()} . * @throws InvalidFormatException If the format of the picture is not known. * @throws IOException If reading the picture-data from the stream fails. + * @see #addPictureData(InputStream, PictureType) */ public String addPictureData(InputStream is, int format) throws InvalidFormatException, IOException { byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); return addPictureData(data, format); } + /** + * Adds a picture to the comments. + * + * @param is The stream to read image from + * @param pictureType The {@link PictureType} of the picture + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException If the pictureType of the picture is not known. + * @throws IOException If reading the picture-data from the stream fails. + * @since POI 5.2.3 + */ + public String addPictureData(InputStream is, PictureType pictureType) throws InvalidFormatException, IOException { + byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); + return addPictureData(data, pictureType); + } + /** * Adds a picture to the comments. * @@ -121,12 +138,29 @@ public class XWPFComments extends POIXMLDocumentPart { * @throws InvalidFormatException If the format of the picture is not known. */ public String addPictureData(byte[] pictureData, int format) throws InvalidFormatException { - XWPFPictureData xwpfPicData = document.findPackagePictureData(pictureData, format); - POIXMLRelation relDesc = XWPFPictureData.RELATIONS[format]; + return addPictureData(pictureData, PictureType.findById(format)); + } + + /** + * Adds a picture to the comments. + * + * @param pictureData The picture data + * @param pictureType The {@link PictureType} of the picture. + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException If the pictureType of the picture is not known. + * @since POI 5.2.3 + */ + public String addPictureData(byte[] pictureData, PictureType pictureType) throws InvalidFormatException { + if (pictureType == null) { + throw new InvalidFormatException("pictureType parameter is invalid"); + } + XWPFPictureData xwpfPicData = document.findPackagePictureData(pictureData); + POIXMLRelation relDesc = XWPFPictureData.RELATIONS[pictureType.getId()]; if (xwpfPicData == null) { /* Part doesn't exist, create a new one */ - int idx = getXWPFDocument().getNextPicNameNumber(format); + int idx = getXWPFDocument().getNextPicNameNumber(pictureType); xwpfPicData = (XWPFPictureData) createRelationship(relDesc, XWPFFactory.getInstance(), idx); /* write bytes to new part */ PackagePart picDataPart = xwpfPicData.getPackagePart(); diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java index 7814406ec5..1d47c9fe54 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFDocument.java @@ -1455,7 +1455,7 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { } } - XWPFPictureData findPackagePictureData(byte[] pictureData, int format) { + XWPFPictureData findPackagePictureData(byte[] pictureData) { long checksum = IOUtils.calculateChecksum(pictureData); XWPFPictureData xwpfPicData = null; /* @@ -1475,13 +1475,40 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { return xwpfPicData; } + /** + * Adds a picture to the document. + * + * @param pictureData The picture data + * @param format the format of the picture, see constants in {@link Document} + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException if the format is not known + * @see #addPictureData(byte[], PictureType) + */ public String addPictureData(byte[] pictureData, int format) throws InvalidFormatException { - XWPFPictureData xwpfPicData = findPackagePictureData(pictureData, format); - POIXMLRelation relDesc = XWPFPictureData.RELATIONS[format]; + return addPictureData(pictureData, PictureType.findById(format)); + } + + /** + * Adds a picture to the document. + * + * @param pictureData The picture data + * @param pictureType the {@link PictureType} + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException if the format is not known + * @since POI 5.2.3 + */ + public String addPictureData(byte[] pictureData, PictureType pictureType) throws InvalidFormatException { + if (pictureType == null) { + throw new InvalidFormatException("pictureType parameter is invalid"); + } + XWPFPictureData xwpfPicData = findPackagePictureData(pictureData); + POIXMLRelation relDesc = XWPFPictureData.RELATIONS[pictureType.getId()]; if (xwpfPicData == null) { /* Part doesn't exist, create a new one */ - int idx = getNextPicNameNumber(format); + int idx = getNextPicNameNumber(pictureType); xwpfPicData = (XWPFPictureData) createRelationship(relDesc, XWPFFactory.getInstance(), idx); /* write bytes to new part */ PackagePart picDataPart = xwpfPicData.getPackagePart(); @@ -1510,6 +1537,16 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { } } + /** + * Adds a picture to the document. + * + * @param is The picture data + * @param format the format of the picture, see constants in {@link Document} + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException if the format is not known + * @see #addPictureData(InputStream, PictureType) + */ public String addPictureData(InputStream is, int format) throws InvalidFormatException { try { byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); @@ -1519,19 +1556,55 @@ public class XWPFDocument extends POIXMLDocument implements Document, IBody { } } + /** + * Adds a picture to the document. + * + * @param is The picture data + * @param pictureType the {@link PictureType} + * @return the index to this picture (0 based), the added picture can be + * obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException if the pictureType is not known + * @since POI 5.2.3 + */ + public String addPictureData(InputStream is, PictureType pictureType) throws InvalidFormatException { + try { + byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); + return addPictureData(data, pictureType); + } catch (IOException e) { + throw new POIXMLException(e); + } + } + /** * get the next free ImageNumber * + * @param format the format of the picture, see constants in {@link Document} * @return the next free ImageNumber * @throws InvalidFormatException If the format of the picture is not known. + * @see #getNextPicNameNumber(PictureType) */ public int getNextPicNameNumber(int format) throws InvalidFormatException { + return getNextPicNameNumber(PictureType.findById(format)); + } + + /** + * get the next free ImageNumber + * + * @param pictureType the {@link PictureType} + * @return the next free ImageNumber + * @throws InvalidFormatException If the pictureType of the picture is not known. + * @since POI 5.2.3 + */ + public int getNextPicNameNumber(PictureType pictureType) throws InvalidFormatException { + if (pictureType == null) { + throw new InvalidFormatException("pictureType parameter is invalid"); + } int img = getAllPackagePictures().size() + 1; - String proposal = XWPFPictureData.RELATIONS[format].getFileName(img); + String proposal = XWPFPictureData.RELATIONS[pictureType.getId()].getFileName(img); PackagePartName createPartName = PackagingURIHelper.createPartName(proposal); while (this.getPackage().getPart(createPartName) != null) { img++; - proposal = XWPFPictureData.RELATIONS[format].getFileName(img); + proposal = XWPFPictureData.RELATIONS[pictureType.getId()].getFileName(img); createPartName = PackagingURIHelper.createPartName(proposal); } return img; diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java index 131c7d3d52..8c5dc99881 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFHeaderFooter.java @@ -233,14 +233,31 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo * @param format The format of the picture. * @return the index to this picture (0 based), the added picture can be obtained from {@link #getAllPictures()} . * @throws InvalidFormatException If the format of the picture is not known. + * @see #addPictureData(byte[], PictureType) */ public String addPictureData(byte[] pictureData, int format) throws InvalidFormatException { - XWPFPictureData xwpfPicData = document.findPackagePictureData(pictureData, format); - POIXMLRelation relDesc = XWPFPictureData.RELATIONS[format]; + return addPictureData(pictureData, PictureType.findById(format)); + } + + /** + * Adds a picture to the document. + * + * @param pictureData The picture data + * @param pictureType The {@link PictureType} of the picture. + * @return the index to this picture (0 based), the added picture can be obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException If the format of the picture is not known. + * @since POI 5.2.3 + */ + public String addPictureData(byte[] pictureData, PictureType pictureType) throws InvalidFormatException { + if (pictureType == null) { + throw new InvalidFormatException("pictureType parameter is invalid"); + } + XWPFPictureData xwpfPicData = document.findPackagePictureData(pictureData); + POIXMLRelation relDesc = XWPFPictureData.RELATIONS[pictureType.getId()]; if (xwpfPicData == null) { /* Part doesn't exist, create a new one */ - int idx = document.getNextPicNameNumber(format); + int idx = document.getNextPicNameNumber(pictureType); xwpfPicData = (XWPFPictureData) createRelationship(relDesc, XWPFFactory.getInstance(), idx); /* write bytes to new part */ PackagePart picDataPart = xwpfPicData.getPackagePart(); @@ -277,12 +294,28 @@ public abstract class XWPFHeaderFooter extends POIXMLDocumentPart implements IBo * @return the index to this picture (0 based), the added picture can be obtained from {@link #getAllPictures()} . * @throws InvalidFormatException If the format of the picture is not known. * @throws IOException If reading the picture-data from the stream fails. + * @see #addPictureData(InputStream, PictureType) */ public String addPictureData(InputStream is, int format) throws InvalidFormatException, IOException { byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); return addPictureData(data, format); } + /** + * Adds a picture to the document. + * + * @param is The stream to read image from + * @param pictureType The {@link PictureType} of the picture. + * @return the index to this picture (0 based), the added picture can be obtained from {@link #getAllPictures()} . + * @throws InvalidFormatException If the format of the picture is not known. + * @throws IOException If reading the picture-data from the stream fails. + * @since POI 5.2.3 + */ + public String addPictureData(InputStream is, PictureType pictureType) throws InvalidFormatException, IOException { + byte[] data = IOUtils.toByteArrayWithMaxLength(is, XWPFPictureData.getMaxImageSize()); + return addPictureData(data, pictureType); + } + /** * returns the PictureData by blipID * diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java index abd499f3f0..00d3479e71 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java @@ -1066,10 +1066,32 @@ public class XWPFRun implements ISDTContents, IRunElement, CharacterRun { * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_PICT * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_JPEG * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_PNG + * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_GIF * @see org.apache.poi.xwpf.usermodel.Document#PICTURE_TYPE_DIB + * @see #addPicture(InputStream, PictureType, String, int, int) */ public XWPFPicture addPicture(InputStream pictureData, int pictureType, String filename, int width, int height) throws InvalidFormatException, IOException { + return addPicture(pictureData, PictureType.findById(pictureType), filename, width, height); + } + + /** + * Adds a picture to the run. This method handles + * attaching the picture data to the overall file. + * + * @param pictureData The raw picture data + * @param pictureType The {@link PictureType} of the picture + * @param width width in EMUs. To convert to / from points use {@link org.apache.poi.util.Units} + * @param height height in EMUs. To convert to / from points use {@link org.apache.poi.util.Units} + * @throws InvalidFormatException If the format of the picture is not known. + * @throws IOException If reading the picture-data from the stream fails. + * @since POI 5.2.3 + */ + public XWPFPicture addPicture(InputStream pictureData, PictureType pictureType, String filename, int width, int height) + throws InvalidFormatException, IOException { + if (pictureType == null) { + throw new InvalidFormatException("pictureType parameter is invalid"); + } String relationId; XWPFPictureData picData; diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSignatureLine.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSignatureLine.java index 95b88bac04..c8af9f5e80 100644 --- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSignatureLine.java +++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFSignatureLine.java @@ -22,7 +22,6 @@ import javax.xml.namespace.QName; import com.microsoft.schemas.office.office.CTSignatureLine; import com.microsoft.schemas.vml.CTImageData; -import org.apache.poi.common.usermodel.PictureType; import org.apache.poi.ooxml.util.XPathHelper; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.poifs.crypt.dsig.SignatureLine; @@ -60,30 +59,30 @@ public class XWPFSignatureLine extends SignatureLine { imageData.setId2(relId); } - private static int mapType(PictureType type) throws InvalidFormatException { + private static PictureType mapType(org.apache.poi.common.usermodel.PictureType type) throws InvalidFormatException { switch (type) { case BMP: - return Document.PICTURE_TYPE_BMP; + return PictureType.BMP; case DIB: - return Document.PICTURE_TYPE_DIB; + return PictureType.DIB; case EMF: - return Document.PICTURE_TYPE_EMF; + return PictureType.EMF; case EPS: - return Document.PICTURE_TYPE_EPS; + return PictureType.EPS; case GIF: - return Document.PICTURE_TYPE_GIF; + return PictureType.GIF; case JPEG: - return Document.PICTURE_TYPE_JPEG; + return PictureType.JPEG; case PICT: - return Document.PICTURE_TYPE_PICT; + return PictureType.PICT; case PNG: - return Document.PICTURE_TYPE_PNG; + return PictureType.PNG; case TIFF: - return Document.PICTURE_TYPE_TIFF; + return PictureType.TIFF; case WMF: - return Document.PICTURE_TYPE_WMF; + return PictureType.WMF; case WPG: - return Document.PICTURE_TYPE_WPG; + return PictureType.WPG; default: throw new InvalidFormatException("Unsupported picture format "+type); } diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java index 3f8e910b52..c23e53b063 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFDocument.java @@ -301,7 +301,7 @@ public final class TestXWPFDocument { void testFindPackagePictureData() throws IOException { try (XWPFDocument doc = XWPFTestDataSamples.openSampleDocument("issue_51265_1.docx")) { byte[] nature1 = XWPFTestDataSamples.getImage("nature1.gif"); - XWPFPictureData part = doc.findPackagePictureData(nature1, Document.PICTURE_TYPE_GIF); + XWPFPictureData part = doc.findPackagePictureData(nature1); assertNotNull(part); assertTrue(doc.getAllPictures().contains(part)); assertTrue(doc.getAllPackagePictures().contains(part)); diff --git a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java index dc614470ea..6a098cd6fb 100644 --- a/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java +++ b/poi-ooxml/src/test/java/org/apache/poi/xwpf/usermodel/TestXWPFRun.java @@ -446,6 +446,8 @@ class TestXWPFRun { for (XWPFPicture pic : pictures) { assertNotNull(pic.getPictureData()); assertEquals("DOZOR", pic.getDescription()); + assertEquals(5, pic.getPictureData().getPictureType()); + assertEquals(PictureType.JPEG, pic.getPictureData().getPictureTypeEnum()); } count += pictures.size();