Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@
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;
Expand All @@ -48,8 +48,10 @@
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;
Expand Down Expand Up @@ -81,13 +83,17 @@ private 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)
Expand All @@ -106,9 +112,13 @@ public static PDImageXObject createFromStream(PDDocument document, InputStream s
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)
{
Expand Down Expand Up @@ -183,7 +193,6 @@ private static Dimensions retrieveDimensions(InputStream stream) throws IOExcept
}
finally
{
stream.reset();
reader.dispose();
}
}
Expand Down Expand Up @@ -370,7 +379,7 @@ private static byte[] encodeImageToJPEGStream(BufferedImage image, float quality
throws IOException
{
ImageWriter imageWriter = getJPEGImageWriter(); // find JAI writer
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();//return stream
try (ImageOutputStream ios = ImageIO.createImageOutputStream(baos))
{
if (ios == null)
Expand Down