Author: tilman
Date: Sun Aug 30 16:21:45 2026
New Revision: 1937665
Log:
PDFBOX-5660: refactor + avoid mark with max int, as suggested by Valery Bokov;
closes #511
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
==============================================================================
---
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
Sun Aug 30 16:21:41 2026 (r1937664)
+++
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.java
Sun Aug 30 16:21:45 2026 (r1937665)
@@ -25,9 +25,9 @@ import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
-import java.io.BufferedInputStream;
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,8 +48,10 @@ import org.apache.logging.log4j.LogManag
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.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;
@@ -81,13 +83,17 @@ public final class JPEGFactory
public static PDImageXObject createFromStream(PDDocument document,
InputStream stream)
throws IOException
{
- if (!stream.markSupported())
+ COSStream cosStream = document.getDocument().createCOSStream();
+ try (OutputStream output = cosStream.createRawOutputStream())
{
- stream = new BufferedInputStream(stream);
+ stream.transferTo(output);
}
- stream.mark(Integer.MAX_VALUE);
- Dimensions meta = retrieveDimensions(stream);
+ Dimensions meta;
+ try (InputStream rawInput = cosStream.createRawInputStream())
+ {
+ meta = retrieveDimensions(rawInput);
+ }
PDColorSpace colorSpace;
switch (meta.numComponents)
@@ -106,9 +112,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)
{
@@ -183,7 +193,6 @@ public final class JPEGFactory
}
finally
{
- stream.reset();
reader.dispose();
}
}