OutOfMemoryError при преобразовании изображений большого размера в PDF с помощью Apache PDFBoxJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 OutOfMemoryError при преобразовании изображений большого размера в PDF с помощью Apache PDFBox

Сообщение Anonymous »

Я использую Apache PDFBox для преобразования файлов изображений в формат PDF на Java. Вот фрагмент моего кода:
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);
}
}

Он отлично работает для большинства изображений, но я сталкиваюсь с ошибками «Недостаточно памяти» для изображений очень больших размеров, даже если размер файла довольно мал (например, 12000 x 2000 пикселей). изображение размером менее 10 МБ). Я подтвердил, что доступно более 200 МБ свободной памяти, поэтому я подозреваю, что это связано с тем, как PDFBox обрабатывает большие размеры, а не с общей доступностью памяти?
Ошибка:
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)


Подробнее здесь: https://stackoverflow.com/questions/793 ... ache-pdfbo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»