Замена изображения с помощью PDFBox не меняет размер PDF в соответствии с изображением
Я использую PDFBox 2.0.8 для замены изображения в моем приложении. Я могу извлечь изображение и заменить его другим изображением того же размера. Однако при уменьшении размера изображения размер PDF не уменьшается. Например, обратитесь к документам / изображениям по ссылкам ниже. Оригинальный размер PDF составляет 93 КБ. Извлеченное изображение составляет 91 КБ. Заменено изображение размером 54 КБ. Размер PDF после замены изображения остается 92 КБ....
- Оригинальный документ = http://35.200.192.44/download?fileName=/outbox/pdf/10_cert.pdf
- Извлеченное изображение = http://35.200.192.44/download?fileName=/outbox/pdf/image0.jpg
- Сменное изображение = http://35.200.192.44/download?fileName=/outbox/pdf/image1.jpg
- PDF после замены = http://35.200.192.44/download?fileName=/outbox/pdf/10_cert1.pdf.
Изменение размера PDF после замены не в той же пропорции... Фрагмент кода, используемый для замены изображения,
BufferedImage buffered_replacement_image_file = ImageIO.read(new File(replacement_image_file));
PDImageXObject replacement_img = JPEGFactory.createFromImage(doc, buffered_replacement_image_file);
resources.put(xObjectName, replacement_img);
1 ответ
Изображения в двух ваших PDF-файлах идентичны. Скорее всего, это связано с тем, как вы загружаете данные изображения, сначала создавая BufferedImage
из файла, а затем создать PDImageXObject
От этого BufferedImage
, Это приводит к тому, что данные входного изображения расширяются до простого растрового изображения, а затем повторно сжимаются в JPEG идентично JPEGFactory.createFromImage
,
Чтобы использовать данные JPEG такими, какими они изначально являются, попробуйте этот подход:
PDImageXObject replacement_img = JPEGFactory.createFromStream(doc, new FileInputStream(replacement_image_file));
resources.put(xObjectName, replacement_img);
или, если replacement_image_file
не обязательно файл JPEG, как это
PDImageXObject replacement_img = PDImageXObject.createFromFileByExtension(new File(replacement_image_file), doc);
resources.put(xObjectName, replacement_img);
Если это не поможет, скорее всего, у вас есть другие проблемы в вашем коде, и вам нужно показать их больше.