[
https://issues.apache.org/jira/browse/PDFBOX-2616?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Jochen Hebbrecht updated PDFBOX-2616:
-------------------------------------
Description:
Hi,
We got the following exception when trying to convert a PDF to an image (see
attachment).
Our JVM actually crashed as well and is no longer running.
Our code to convert the PDF to image:
{code}
public static void generateThumbnail(InputStream is, FileExtension
fileExtension, OutputStream os, Hashtable<String, Object> attributes) throws
OneaException {
// Create JPEG writer
ImageWriter writer = null;
try {
// Load the attributes
Integer size = 400;
if (attributes.containsKey(ATTRIBUTE_SIZE)) {
try {
size = (Integer)
attributes.get(ATTRIBUTE_SIZE);
} catch (Exception ex) {
throw new OneaException("Error while
loading the '" + ATTRIBUTE_SIZE + "' attribute");
}
}
Float quality = 0.75f;
if (attributes.containsKey(ATTRIBUTE_QUALITY)) {
try {
quality = (Float)
attributes.get(ATTRIBUTE_QUALITY);
} catch (Exception ex) {
throw new OneaException("Error while
loading the '" + ATTRIBUTE_QUALITY + "' attribute");
}
}
Boolean color = false;
if (attributes.containsKey(ATTRIBUTE_COLOR)) {
try {
color = (Boolean)
attributes.get(ATTRIBUTE_COLOR);
} catch (Exception ex) {
throw new OneaException("Error while
loading the '" + ATTRIBUTE_COLOR + "' attribute");
}
}
// Load the image
BufferedImage img = loadImage(is, fileExtension);
// To grayscale
if (color == null || !color) {
BufferedImage grayImg = new
BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
Graphics g = grayImg.getGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
img = grayImg;
}
// Scale the image
img = scaleImage(img, size, size);
ImageWriteParam writerParams = null;
try {
JPEGImageWriterSpi jpegspi = new
JPEGImageWriterSpi();
writer = jpegspi.createWriterInstance();
writerParams = writer.getDefaultWriteParam();
writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writerParams.setCompressionQuality(quality);
} catch (Exception ex) {
throw new OneaException("Could not load the
JPEG writer", ex);
}
// Write the image
writer.setOutput(ImageIO.createImageOutputStream(os));
writer.write(null, new IIOImage(img, null, null),
writerParams);
} catch (Exception ex) {
throw new OneaException(ex.getMessage() == null ?
"Error while writing the JPG thumbnail" : ex.getMessage(), ex);
} finally {
StreamTools.closeStream(is);
StreamTools.closeStream(os);
if (writer != null)
writer.dispose();
}
}
// Helper methods
private static BufferedImage loadImage(InputStream is, FileExtension
fileExtension) throws OneaException {
if (fileExtension == null)
throw new OneaException("No file type passed");
switch (fileExtension) {
case PDF:
PDDocument document = null;
try {
// Load the PDF file
document = PDDocument.load(is);
PDPage page = (PDPage)
document.getDocumentCatalog().getAllPages().get(0);
// Fetches conversion images
PDResources resources =
page.getResources();
Map<String, PDXObjectImage> images =
resources.getImages();
if (images != null) {
for (String key :
images.keySet()) {
PDXObjectImage image =
images.get(key);
if (image.getRGBImage()
== null) {
throw new
OneaException("No RGBImage found (check conversion)");
}
}
}
// Convert the first page to an image
return page.convertToImage();
} catch (Exception ex) {
throw new OneaException(ex.getMessage()
== null ? "Error while decoding PDF" : ex.getMessage(), ex);
} finally {
try {
if (document != null)
document.close();
} catch (Exception ex) {
}
}
case TIF:
case TIFF:
case PNG:
case JPEG:
case GIF:
ImageInputStream iis = null;
try {
iis =
ImageIO.createImageInputStream(is);
Iterator<ImageReader> readers =
ImageIO.getImageReaders(iis);
if (!readers.hasNext())
throw new OneaException("Cannot
load '" + fileExtension.toString() + "' reader");
// Get TIFF reader, and set input
ImageReader reader = readers.next();
reader.setInput(iis);
return reader.read(0, null);
} catch (Exception ex) {
throw new OneaException("Error while
decoding '" + fileExtension.toString() + "'", ex);
} finally {
if (iis != null)
try {
iis.close();
} catch (Exception ex) {
}
}
default:
throw new OneaException("Cannot generate the
thumbnail image, unknown file type");
}
}
private static BufferedImage scaleImage(BufferedImage img, int
maxWidth, int maxHeight) throws OneaException {
Double w = new Double(img.getWidth());
Double h = new Double(img.getHeight());
// Calculate scale factor
Double f1 = new Double(maxHeight) / h;
Double f2 = new Double(maxWidth) / w;
Double factor = f1 > f2 ? f2 : f1;
w = w * factor;
h = h * factor;
// Scale the image
BufferedImage thumb = new BufferedImage(w.intValue(),
h.intValue(), img.getType());
AffineTransform at = new AffineTransform();
at.scale(factor, factor);
thumb = new AffineTransformOp(at,
AffineTransformOp.TYPE_BILINEAR).filter(img, thumb);
return thumb;
}
{code}
was:
Hi,
We got the following exception when trying to convert a PDF to an image:
> JVM crashes while trying to convert PDF to JPG image (only on Windows)
> ----------------------------------------------------------------------
>
> Key: PDFBOX-2616
> URL: https://issues.apache.org/jira/browse/PDFBOX-2616
> Project: PDFBox
> Issue Type: Bug
> Affects Versions: 1.8.8
> Environment: Windows 7
> Reporter: Jochen Hebbrecht
> Attachments: screenshot-1.png
>
>
> Hi,
> We got the following exception when trying to convert a PDF to an image (see
> attachment).
> Our JVM actually crashed as well and is no longer running.
> Our code to convert the PDF to image:
> {code}
> public static void generateThumbnail(InputStream is, FileExtension
> fileExtension, OutputStream os, Hashtable<String, Object> attributes) throws
> OneaException {
> // Create JPEG writer
> ImageWriter writer = null;
>
> try {
> // Load the attributes
> Integer size = 400;
> if (attributes.containsKey(ATTRIBUTE_SIZE)) {
> try {
> size = (Integer)
> attributes.get(ATTRIBUTE_SIZE);
> } catch (Exception ex) {
> throw new OneaException("Error while
> loading the '" + ATTRIBUTE_SIZE + "' attribute");
> }
> }
> Float quality = 0.75f;
> if (attributes.containsKey(ATTRIBUTE_QUALITY)) {
> try {
> quality = (Float)
> attributes.get(ATTRIBUTE_QUALITY);
> } catch (Exception ex) {
> throw new OneaException("Error while
> loading the '" + ATTRIBUTE_QUALITY + "' attribute");
> }
> }
> Boolean color = false;
> if (attributes.containsKey(ATTRIBUTE_COLOR)) {
> try {
> color = (Boolean)
> attributes.get(ATTRIBUTE_COLOR);
> } catch (Exception ex) {
> throw new OneaException("Error while
> loading the '" + ATTRIBUTE_COLOR + "' attribute");
> }
> }
>
> // Load the image
> BufferedImage img = loadImage(is, fileExtension);
>
> // To grayscale
> if (color == null || !color) {
> BufferedImage grayImg = new
> BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
> Graphics g = grayImg.getGraphics();
> g.drawImage(img, 0, 0, null);
> g.dispose();
> img = grayImg;
> }
>
> // Scale the image
> img = scaleImage(img, size, size);
>
> ImageWriteParam writerParams = null;
> try {
> JPEGImageWriterSpi jpegspi = new
> JPEGImageWriterSpi();
> writer = jpegspi.createWriterInstance();
> writerParams = writer.getDefaultWriteParam();
>
> writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
> writerParams.setCompressionQuality(quality);
> } catch (Exception ex) {
> throw new OneaException("Could not load the
> JPEG writer", ex);
> }
>
> // Write the image
> writer.setOutput(ImageIO.createImageOutputStream(os));
> writer.write(null, new IIOImage(img, null, null),
> writerParams);
> } catch (Exception ex) {
> throw new OneaException(ex.getMessage() == null ?
> "Error while writing the JPG thumbnail" : ex.getMessage(), ex);
> } finally {
> StreamTools.closeStream(is);
> StreamTools.closeStream(os);
> if (writer != null)
> writer.dispose();
> }
> }
>
> // Helper methods
>
> private static BufferedImage loadImage(InputStream is, FileExtension
> fileExtension) throws OneaException {
> if (fileExtension == null)
> throw new OneaException("No file type passed");
>
> switch (fileExtension) {
> case PDF:
> PDDocument document = null;
> try {
> // Load the PDF file
> document = PDDocument.load(is);
> PDPage page = (PDPage)
> document.getDocumentCatalog().getAllPages().get(0);
>
> // Fetches conversion images
> PDResources resources =
> page.getResources();
> Map<String, PDXObjectImage> images =
> resources.getImages();
> if (images != null) {
> for (String key :
> images.keySet()) {
> PDXObjectImage image =
> images.get(key);
> if (image.getRGBImage()
> == null) {
> throw new
> OneaException("No RGBImage found (check conversion)");
> }
> }
> }
>
> // Convert the first page to an image
> return page.convertToImage();
>
> } catch (Exception ex) {
> throw new OneaException(ex.getMessage()
> == null ? "Error while decoding PDF" : ex.getMessage(), ex);
> } finally {
> try {
> if (document != null)
> document.close();
> } catch (Exception ex) {
> }
> }
> case TIF:
> case TIFF:
> case PNG:
> case JPEG:
> case GIF:
> ImageInputStream iis = null;
> try {
> iis =
> ImageIO.createImageInputStream(is);
> Iterator<ImageReader> readers =
> ImageIO.getImageReaders(iis);
> if (!readers.hasNext())
> throw new OneaException("Cannot
> load '" + fileExtension.toString() + "' reader");
> // Get TIFF reader, and set input
> ImageReader reader = readers.next();
> reader.setInput(iis);
>
> return reader.read(0, null);
> } catch (Exception ex) {
> throw new OneaException("Error while
> decoding '" + fileExtension.toString() + "'", ex);
> } finally {
> if (iis != null)
> try {
> iis.close();
> } catch (Exception ex) {
> }
> }
> default:
> throw new OneaException("Cannot generate the
> thumbnail image, unknown file type");
> }
>
> }
>
> private static BufferedImage scaleImage(BufferedImage img, int
> maxWidth, int maxHeight) throws OneaException {
> Double w = new Double(img.getWidth());
> Double h = new Double(img.getHeight());
>
> // Calculate scale factor
> Double f1 = new Double(maxHeight) / h;
> Double f2 = new Double(maxWidth) / w;
> Double factor = f1 > f2 ? f2 : f1;
> w = w * factor;
> h = h * factor;
>
> // Scale the image
> BufferedImage thumb = new BufferedImage(w.intValue(),
> h.intValue(), img.getType());
> AffineTransform at = new AffineTransform();
> at.scale(factor, factor);
> thumb = new AffineTransformOp(at,
> AffineTransformOp.TYPE_BILINEAR).filter(img, thumb);
>
> return thumb;
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)