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

Reply via email to