Есть ли способ извлечь байты изображения из PDImageXObject для разных типов изображений, не загружая их в BufferedImage? TIFF-файл размером 15 МБ при загрузке в BufferedImage занимает 200 МБ памяти, чего я хотел бы избежать.
Я нашел пример для файлов JPG, но я понятия не имею, что он делает, или можно ли это сделать эквивалент для других типов файлов: PNG, GIF, TIFF и др. c.
// I don't really understand this, but it works for JPEGs
private static final List<String> PDF_JPEG_STOP_FILTERS = Arrays.asList(
COSName.DCT_DECODE.getName(),
COSName.DCT_DECODE_ABBREVIATION.getName());
public void extractImage(PDImageXObject pdImage, OutpuStream baos) {
if ("jpg".equals(pdImage.getSuffix())) {
try (InputStream is = pdImage.createInputStream(PDF_JPEG_STOP_FILTERS)) {
IOUtils.copy(is, baos);
}
} else {
BufferedImage image = pdImage.getImage();
// image.raster.data is huge
ImageIO.write(image, "jpg", baos);
}
}