Author: tilman
Date: Sun Aug 30 16:21:37 2026
New Revision: 1937663
Log:
PDFBOX-5660: refactor + avoid mark with max int, as suggested by Valery Bokov;
closes #511
Modified:
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
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/JPEGFactory.java
Sun Aug 30 16:16:28 2026 (r1937662)
+++
pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
Sun Aug 30 16:21:37 2026 (r1937663)
@@ -23,11 +23,11 @@ import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;
-import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
@@ -48,9 +48,12 @@ import org.apache.commons.logging.LogFac
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSInteger;
import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.cos.COSStream;
import org.apache.pdfbox.filter.Filter;
import org.apache.pdfbox.filter.MissingImageReaderException;
+import org.apache.pdfbox.io.IOUtils;
import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.common.PDStream;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceCMYK;
import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
@@ -74,21 +77,35 @@ public final class JPEGFactory
*
* The input stream data will be preserved and embedded in the PDF file
without modification.
* @param document the document where the image will be created
- * @param stream a stream of JPEG data
+ * @param is a stream of JPEG data
* @return a new Image XObject
*
* @throws IOException if the input stream cannot be read
*/
- public static PDImageXObject createFromStream(PDDocument document,
InputStream stream)
+ public static PDImageXObject createFromStream(PDDocument document,
InputStream is)
throws IOException
{
- if (!stream.markSupported())
+ COSStream cosStream = document.getDocument().createCOSStream();
+ OutputStream os = cosStream.createRawOutputStream();
+ try
{
- stream = new BufferedInputStream(stream);
+ IOUtils.copy(is, os);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(os);
}
- stream.mark(Integer.MAX_VALUE);
- Dimensions meta = retrieveDimensions(stream);
+ InputStream rawInput = cosStream.createRawInputStream();
+ Dimensions meta;
+ try
+ {
+ meta = retrieveDimensions(rawInput);
+ }
+ finally
+ {
+ IOUtils.closeQuietly(rawInput);
+ }
PDColorSpace colorSpace;
switch (meta.numComponents)
@@ -107,9 +124,13 @@ public final class JPEGFactory
meta.numComponents);
}
- // create PDImageXObject from stream
- PDImageXObject pdImage = new PDImageXObject(document, stream,
- COSName.DCT_DECODE, meta.width, meta.height, 8, colorSpace);
+ // create PDImageXObject around the already-populated stream, no
further copying
+ cosStream.setItem(COSName.FILTER, COSName.DCT_DECODE);
+ PDImageXObject pdImage = new PDImageXObject(new PDStream(cosStream),
null);
+ pdImage.setBitsPerComponent(8);
+ pdImage.setWidth(meta.width);
+ pdImage.setHeight(meta.height);
+ pdImage.setColorSpace(colorSpace);
if (colorSpace instanceof PDDeviceCMYK)
{
@@ -197,7 +218,6 @@ public final class JPEGFactory
{
iis.close();
}
- stream.reset();
reader.dispose();
}
}