首页 > 解决方案 > 使用 PDFBox 替换图像不会根据图像更改 pdf 的大小

问题描述

我正在使用 PDFBox 2.0.8 替换应用程序中的图像。我能够提取图像并将其替换为另一个相同尺寸的图像。但是,如果图像大小减小,则 PDF 的大小不会减小。例如,请参阅以下链接中的文档/图像。PDF 的原始大小为 93 KB。提取的图像为 91 KB。替换后的图像为 54 KB。图片替换后的PDF大小仍然是92 KB....

  1. 原始文件 = http://35.200.192.44/download?fileName=/outbox/pdf/10_cert.pdf
  2. 提取图像 = http://35.200.192.44/download?fileName=/outbox/pdf/image0.jpg
  3. 替换图片 = http://35.200.192.44/download?fileName=/outbox/pdf/image1.jpg
  4. 替换后的 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);

标签: pdfbox

解决方案


您的两个示例 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);

如果这没有帮助,您的代码中很可能还有其他问题,需要显示更多。


推荐阅读