pdfbox - 使用 PDFBox 替换图像不会根据图像更改 pdf 的大小
问题描述
我正在使用 PDFBox 2.0.8 替换应用程序中的图像。我能够提取图像并将其替换为另一个相同尺寸的图像。但是,如果图像大小减小,则 PDF 的大小不会减小。例如,请参阅以下链接中的文档/图像。PDF 的原始大小为 93 KB。提取的图像为 91 KB。替换后的图像为 54 KB。图片替换后的PDF大小仍然是92 KB....
- 原始文件 = 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);
解决方案
您的两个示例 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);
如果这没有帮助,您的代码中很可能还有其他问题,需要显示更多。