【问题标题】:How to remove duplicate objects in PDF using ghostscript?如何使用 ghostscript 删除 PDF 中的重复对象?
【发布时间】:2015-02-02 10:27:51
【问题描述】:

使用命令行 ghostscript,是否可以删除 PDF 中重复的嵌入对象(图像)并用单个实例替换它们?

我有一个 200 多页的 PDF,每页都有背景图片和一些较小的徽标。该文件非常大,因为相同的背景图像和徽标二进制文件嵌入在每个单独的页面中,而不是嵌入一次然后在每个页面上引用。我不是 PDF 的创建者,所以我无法从源头解决问题。

(我不想缩小或降低图像质量,也不想完全删除它们。)

【问题讨论】:

    标签: pdf command-line ghostscript duplicate-removal


    【解决方案1】:

    作为ghostscript的补充,pdfsizeopt在消除PDF中重复的嵌入对象(包括背景图像)方面做得非常好,并且可以在ghostscript处理文件之前或之后运行。然而,由于它的依赖关系,将其包含在工作流中有点棘手,并且会创建很多临时文件。可以在https://github.com/pts/pdfsizeopt(以前的https://code.google.com/p/pdfsizeopt/)找到

    仅通过删除重复图像,我的 200 多页文档从 150MB 增加到 40MB。

    【讨论】:

      【解决方案2】:

      不,ghostscript(更具体地说是 pdfwrite 设备)不会替换图像 XObject 或内联图像,它不会测试它们是否相同。

      这样做是可能的,但这意味着检查每个图像的每个字节,这在性能上可能会非常昂贵,因此我们目前不这样做。如果您想尝试修改源代码,我可以就从哪里开始提供一些建议。

      FWIW 对许多其他对象进行重复测试,但不是图像,这仅仅是因为读取和散列大图像所花费的时间。

      【讨论】:

      • 我有点怀疑你对的假设“这意味着检查每个图像的每个字节”。难道不能从图像流中创建散列,然后只比较这些吗? (除非您将哈希的创建算作“检查每个字节”,不知何故它也是......)
      • 是的,我确实将创建图像的散列视为“检查每个字节”,因为这就是您需要做的。目前 pdfwrite 正是为此目的为大量不同的对象类型创建 MD5 哈希,但它不会为图像执行此操作,因为读取数兆字节的数据通常是一个相当不寻常的功能被认为是不值得的。正如我所说,如果有人真的想这样做,我可以提供关于在哪里创建哈希、如何确定现有哈希是否匹配以及如何用对旧图像的引用替换新图像的指针。
      • 如果有人能接受这样的挑战并在您的帮助下实施它,那就太好了。由于 OP 中描述的原因,有很多“坏”的 PDF 文件太大了。
      • 也许两步法可以加快速度?首先检查相同长度的对象。在大多数情况下,图像将具有不同的长度。只有当另一个对象的大小匹配时,才做哈希? (我目前无法更改源并自己构建 gs,但感谢您的提议。)
      • 您必须对这两个图像进行哈希处理。鉴于无论如何我们都必须解压缩并读取整个图像数据,它的开销并不大(通过 MD5 哈希算法处理图像数据所花费的时间),但我认为 2阶段方法会慢很多,仅仅是因为在处理图像时进行散列会比事后进行更快。虽然对于图像匹配的常见情况可能会更快。不过更多的编码。
      猜你喜欢
      • 2018-11-19
      • 2014-04-18
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      相关资源
      最近更新 更多