OutOfMemoryError beim Konvertieren großformatiger Bilder in PDF mit Apache PDFBox [Duplikat]
Posted: 11 Jan 2025, 10:57
Ich verwende Apache PDFBox, um Bilddateien in Java in das PDF-Format zu konvertieren. Hier ist ein Ausschnitt meines Codes:
Für die meisten Bilder funktioniert es gut, aber bei Bildern mit sehr großen Abmessungen treten Fehlermeldungen wegen unzureichendem Arbeitsspeicher auf, selbst wenn die Dateigröße recht klein ist (z. B. 12.000 x 2.000 Pixel). Bild, das weniger als 10 MB groß ist). Ich habe bestätigt, dass über 200 MB freier Speicher verfügbar sind. Ich vermute daher, dass es eher an der Art und Weise liegt, wie PDFBox mit großen Dimensionen umgeht, als an der Gesamtspeicherverfügbarkeit?
Fehler:
Code: Select all
private static byte[] convertImageToPdf(byte[] imageBytes, String fileType) {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage(PDRectangle.A4);
document.addPage(page);
PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, fileType);
drawImageOnPage(document, page, image);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
document.save(outputStream);
return outputStream.toByteArray();
} catch (Exception e) {
log.error("Failed to convert image to PDF", e);
throw new RuntimeException("Failed to convert image to PDF", e);
}
}
Fehler:
Code: Select all
Caused by: javax.imageio.IIOException: Caught exception during read:
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1851)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1466)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1363)
at org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject.createFromByteArray(PDImageXObject.java:384)
at com.example.FileConverter.convertImageToPdf(FileConverter.java:106)
... 33 more
Caused by: java.lang.OutOfMemoryError: Java heap space
at java.desktop/java.awt.image.DataBufferByte.(DataBufferByte.java:93)
at java.desktop/java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java:433)
at java.desktop/java.awt.image.Raster.createWritableRaster(Raster.java:1121)
at java.desktop/javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java:1066)
at java.desktop/javax.imageio.ImageReader.getDestination(ImageReader.java:2877)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1485)
at java.desktop/com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1844)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1466)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1363)
at app.package.PdfImageProcessor.processImage(PdfImageProcessor.java:384)
at app.package.PdfImageProcessor.convertImageToPdf(PdfImageProcessor.java:106)
at app.package.PdfImageProcessor.convertFileToPdf(PdfImageProcessor.java:41)
at app.package.DocumentHandler.validateAndUpload(DocumentHandler.java:60)
at app.package.DocumentHandler_Subclass.validateAndUpload(Unknown Source)
at app.package.DocumentHandler_Subclass.lambda$process$1(Unknown Source)
at framework.package.InvocationContext.proceed(InvocationContext.java:73)
at framework.package.InvocationContext.proceed(InvocationContext.java:62)
at framework.package.TransactionManager.invokeInTransaction(TransactionManager.java:136)
at framework.package.TransactionManager.invokeInTransaction(TransactionManager.java:107)
at framework.package.TransactionalInterceptor.doIntercept(TransactionalInterceptor.java:38)
at framework.package.TransactionManager.intercept(TransactionManager.java:61)
at framework.package.TransactionalInterceptor.intercept(TransactionalInterceptor.java:32)
at framework.package.TransactionBeanInterceptor.intercept(Unknown Source)
at framework.package.InvocationHandler.invoke(InvocationHandler.java:42)
at framework.package.InvocationContext.perform(InvocationContext.java:30)
at framework.package.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
at app.package.DocumentHandler_Subclass.upload(Unknown Source)
at app.package.DocumentHandler_ClientProxy.upload(Unknown Source)
at app.package.MessageListener.onMessage(MessageListener.java:31)
at app.package.MessageListener_ClientProxy.onMessage(Unknown Source)
at messaging.package.JmsMessageConsumer.callMessageListener(JmsMessageConsumer.java:1225)
at messaging.package.AsyncMessageHandler.callMessageListener(AsyncMessageHandler.java:782)