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();
         }
     }

Reply via email to