Это относится к Как эффективно извлекать байты изображений из 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 . Но я думал, что обработка плитки за один раз выглядела многообещающе.