You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2017/03/16 18:28:58 UTC
svn commit: r1787225 - in
/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox:
pdmodel/graphics/image/JPEGFactory.java
pdmodel/graphics/image/PDImageXObject.java
util/filetypedetector/FileTypeDetector.java
Author: tilman
Date: Thu Mar 16 18:28:58 2017
New Revision: 1787225
URL: http://svn.apache.org/viewvc?rev=1787225&view=rev
Log:
PDFBOX-3716: add methods for byte array input, as suggested by Alex Yolkin
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java?rev=1787225&r1=1787224&r2=1787225&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java Thu Mar 16 18:28:58 2017
@@ -71,8 +71,23 @@ public final class JPEGFactory
public static PDImageXObject createFromStream(PDDocument document, InputStream stream)
throws IOException
{
+ return createFromByteArray(document, IOUtils.toByteArray(stream));
+ }
+
+ /**
+ * Creates a new JPEG Image XObject from a byte array containing JPEG data.
+ *
+ * @param document the document where the image will be created
+ * @param byteArray bytes of JPEG image
+ * @return a new Image XObject
+ *
+ * @throws IOException if the input stream cannot be read
+ */
+ public static PDImageXObject createFromByteArray(PDDocument document, byte[] byteArray)
+ throws IOException
+ {
// copy stream
- ByteArrayInputStream byteStream = new ByteArrayInputStream(IOUtils.toByteArray(stream));
+ ByteArrayInputStream byteStream = new ByteArrayInputStream(byteArray);
// read image
BufferedImage awtImage = readJPEG(byteStream);
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1787225&r1=1787224&r2=1787225&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Thu Mar 16 18:28:58 2017
@@ -22,6 +22,7 @@ import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@@ -285,6 +286,56 @@ public final class PDImageXObject extend
throw new IllegalArgumentException("Image type not supported: " + file.getName());
}
+ /**
+ * Create a PDImageXObject from bytes of an image file. The file format is determined by the
+ * file content. The following file types are supported: jpg, jpeg, tif, tiff, gif, bmp and png.
+ * This is a convenience method that calls {@link JPEGFactory#createFromBytesArray},
+ * {@link CCITTFactory#createFromFile} or {@link ImageIO#read} combined with
+ * {@link LosslessFactory#createFromImage}. (The later can also be used to create a
+ * PDImageXObject from a BufferedImage).
+ *
+ * @param byteArray bytes from an image file.
+ * @param document the document that shall use this PDImageXObject.
+ * @param name name of image file for exception messages, can be null.
+ * @return a PDImageXObject.
+ * @throws IOException if there is an error when reading the file or creating the
+ * PDImageXObject.
+ * @throws IllegalArgumentException if the image type is not supported.
+ */
+ public static PDImageXObject createFromByteArray(PDDocument document, byte[] byteArray, String name) throws IOException
+ {
+ FileType fileType;
+ try
+ {
+ fileType = FileTypeDetector.detectFileType(byteArray);
+ }
+ catch (IOException e)
+ {
+ throw new IOException("Could not determine file type: " + name, e);
+ }
+ if (fileType == null)
+ {
+ throw new IllegalArgumentException("Image type not supported: " + name);
+ }
+
+ if (fileType.equals(FileType.JPEG))
+ {
+ PDImageXObject imageXObject = JPEGFactory.createFromByteArray(document, byteArray);
+ return imageXObject;
+ }
+ if (fileType.equals(FileType.TIFF))
+ {
+ return CCITTFactory.createFromByteArray(document, byteArray);
+ }
+ if (fileType.equals(FileType.BMP) || fileType.equals(FileType.GIF) || fileType.equals(FileType.PNG))
+ {
+ ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
+ BufferedImage bim = ImageIO.read(bais);
+ return LosslessFactory.createFromImage(document, bim);
+ }
+ throw new IllegalArgumentException("Image type not supported: " + name);
+ }
+
// repairs parameters using decode result
private static PDStream repair(PDStream stream, COSInputStream input)
{
Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java?rev=1787225&r1=1787224&r2=1787225&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/util/filetypedetector/FileTypeDetector.java Thu Mar 16 18:28:58 2017
@@ -110,4 +110,9 @@ public final class FileTypeDetector
//noinspection ConstantConditions
return root.find(bytes);
}
+
+ public static FileType detectFileType(final byte[] fileBytes) throws IOException
+ {
+ return root.find(fileBytes);
+ }
}