PDFBox Outofmemory при преобразовании PDF в Tiff, как сжимать изображения JPEG?

Я пытаюсь использовать изображения как новую страницу в файлах PDF, изображения JPEG слишком велики по размеру, хотя они добавляются нормально, но я сталкиваюсь с проблемой при преобразовании PDF в Tiff, исключение из памяти, есть ли способ сжать эти JPEG файлы

Ниже код для преобразования изображений в PDF

PDImageXObject image = PDImageXObject.createFromFile(imagePath, doc);           
            PDPage page = new PDPage(new PDRectangle(image.getWidth(), image.getHeight()));
            doc.addPage(page);
            try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
                contents.drawImage(image, 0,0);     
                contents.close();

            }

Ниже конвертировать в PDF в TIFF

document = PDDocument.load(new File(pdfFilename));
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            BufferedImage[] images = new BufferedImage[document.getNumberOfPages()];

            for (int i = 0; i < images.length; i++) {
                PDPage page = (PDPage) document.getPage(i);
                BufferedImage image;
                try {
                    image = pdfRenderer.renderImageWithDPI(i, 300, ImageType.RGB); // its throwing outofmemory error at this line
                    images[i] = image;
                } catch (IOException e) {
                    LOGGER.error("Exception while reading merged pdf file:" + e.getMessage());
                    throw e;
                }
            }

            File tempFile = new File(tiffFileName+".tiff");
            ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
            ImageOutputStream output = ImageIO.createImageOutputStream(tempFile);
            writer.setOutput(output);
            ImageWriteParam params = writer.getDefaultWriteParam();
            params.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
            writer.prepareWriteSequence(null);
            for (int i = 0; i < images.length; i++) {
                params.setCompressionType("JPEG");
                writer.writeToSequence(new IIOImage(images[i], null, null), params);
            }
            writer.endWriteSequence();

1 ответ

Чтобы избежать исключения нехватки памяти, попробуйте запустить приложение, передав ему параметры Xms и Xmx, используя подходящие значения. См. Этот пост. Каковы параметры Xms и Xmx при запуске JVM? и https://docs.oracle.com/cd/E21764_01/web.1111/e13814/jvm_tuning.htm:

Установка начального и минимального размера кучи

-Xms Oracle рекомендует установить минимальный размер кучи (-Xms), равный максимальному размеру кучи (-Xmx), чтобы минимизировать сборку мусора.

Установка максимального размера кучи

-Xmx Установка низкого максимального значения кучи по сравнению с объемом активных данных снижает производительность, вызывая частые сборки мусора.

Другие вопросы по тегам