【问题标题】:Image replacement using PDFBox does not change size of pdf according to image使用 PDFBox 替换图像不会根据图像更改 pdf 的大小
【发布时间】:2018-07-29 17:21:35
【问题描述】:

我正在使用 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大小的变化比例不一样...图片替换用的代码sn-p是

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);

【问题讨论】:

  • 由于您将jpg解压为BufferedImage,然后使用JPEGFactory重新压缩,因此对原始大小影响不大。尝试以较低的质量调用JPEGFactory#createFromImage(0.7-0.9 是可接受质量的一个很好的范围)。我认为没有办法使用 PDFBox 直接插入 jpg,但我不确定。
  • 你的文件已经不存在了。
  • @Itai “我认为没有办法使用 PDFBox 直接插入 jpg,但我不确定。” - 你可以使用JPEGFactory 方法 createFromByteArraycreateFromStream
  • 现在应该可以访问链接了。我想使用内部软件进行图像处理。代码是否 sn -p resources.put(xObjectName, replacement_img);不会覆盖现有图像。 Replacement_img 是文件系统上的 jpg 文件
  • @mkl - 很高兴知道!出于某种原因,我假设所有 JPEGFactory 方法都需要一个位图(基本上),即使现在我查看文档很明显字节数组采用的是直接 JPEG。

标签: pdfbox


【解决方案1】:

您的两个示例 PDF 中的图像是相同的。这很可能是由于您加载图像数据的方式,首先从文件创建BufferedImage,然后从该BufferedImage 创建PDImageXObject。这会导致输入图像数据被扩展为纯位图,然后由JPEGFactory.createFromImage 重新压缩为相同的JPEG。

要按原样使用 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);

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

【讨论】:

  • 参考链接:35.200.192.44/download?fileName=/outbox/pdf/Code_Snippet.txt.... 我已将代码更改为 JPEGFactory.createFromStream(doc, new FileInputStream(replacement_image_file));。这已经创建了大小合适的 PDF。但是,这会产生带有乱码图像的 PDF。当我在 Google Chrome 中查看时,PDF 看起来不错。但是,当我在我的 adobe 阅读器中查看时,它并不好。参考链接35.200.192.44/download?fileName=/outbox/pdf/10_cert1.pdf & 35.200.192.44/download?fileName=/outbox/pdf/…
  • 您使用哪个 Adob​​e Reader 版本进行测试?我尝试了当前的 Adob​​e Reader DC 和 Adob​​e Acrobat 9.5,它们都没有像你的屏幕截图那样显示任何东西。
  • 我在 Windows 10 上使用 11.0.0 版
  • 这很奇怪。如上所述,我无法重现当前和旧 adobe 软件的问题。
  • 这是否意味着此问题仅限于我的机器?您使用的是哪个操作系统?
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 2016-07-04
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
相关资源
最近更新 更多