Извлечь изображение в файл из PDImageXObject, не загружая его в память - PullRequest
2 голосов
/ 08 февраля 2020

Это относится к Как эффективно извлекать байты изображений из PDF , но я постараюсь переформулировать проблему иначе, поэтому речь идет не столько об анализе PDF, сколько об обработке изображений.

Я использую PDFBox для извлечения изображений из файлов PDF. Существует класс PDImageXObject , который представляет изображение в PDF-файле, который содержит метаданные изображения (высота, ширина и т. Д. c), и предоставляет два API для извлечения изображения: BufferedImage getImage() и BufferedImage getImage(Rectangle rect, int subsampling);.

Текущий код прост:

BufferedImage image = pdImage.getImage();
ImageIO.write(image, "jpg", baos);

Однако для большого изображения у меня возникла проблема с использованием памяти, так как BufferedImage хранит несжатые данные изображения в памяти, что намного больше, чем сжатый результат.

Есть ли способ избежать загрузки всего изображения в память, разбивая его на фрагменты (например, 1024x1024) и перебирая их, используя сигнатуру getImage, которая принимает Rectangle? Я вижу многообещающую информацию о том, что JAI может использовать Tiles для вывода сжатого изображения без одновременной загрузки несжатого содержимого в память, но я не понимаю, как его ie объединить с тем, что у меня есть из PDImageXObject. Или есть другой способ сделать это? Является ли JAI все еще активным проектом?

Кстати, целью извлечения изображения является его передача в следующий компонент в конвейере, который может обрабатывать несколько форматов изображений. Так что, если какой-то формат, отличный от jpg, больше подходит для мозаичной обработки, это должно быть нормально.

Мне известна одна возможность использования чего-то вроде BigBufferedImage . Но я думал, что обработка плитки за один раз выглядела многообещающе.

1 Ответ

0 голосов
/ 26 февраля 2020

ОК, я нашел библиотеку: Commons Imaging . Класс Imaging может быть, может помочь вам.

Я думаю, вы можете попробовать метод createInputStream(), узнать размер реальных данных (длина в байтах).

...