【问题标题】:How do you debug PDF files?如何调试 PDF 文件?
【发布时间】:2010-12-23 23:42:20
【问题描述】:

很多时候我以编程方式创建 PDF,但它可能存在问题,例如某些特定的字母可能无法很好地显示,或者我可能有编码问题等。

有什么方法可以调试 PDF 吗?例如。看到它的详细结构了吗?

【问题讨论】:

标签: debugging pdf


【解决方案1】:

这是我在 Linux 中通常做的事情:

【讨论】:

    【解决方案2】:

    有许多免费工具可让您查看未压缩和解密的 PDF 内容(给定密码)。

    我想到了用于 iText 的 RUPS(但我有偏见)。我不知道是否有 iTextSharp 等价物。它是一个带有 PDF 对象树视图(所有这些应用程序都有)的 GUI。

    有些可以让您在该树中编辑 PDF,但数量不多。我相信 Windjack 的 PDF CanOpener 会(以及您期望从商业 Acrobat 插件获得的其他几个漂亮功能)。

    在紧要关头, 可以工作...但不要尝试更改任何内容。 PDF 是一种二进制格式:字节偏移很重要。如果您的文本编辑器将 \n 更改为 \r\n(或尝试将其解释为 UTF-8、或、或、或),您的 PDF 将被严重损坏。不要那样做。

    我最终做了很多搜索给定的对象编号来查找间接引用。查找单个数字引用总是很痛苦,因为“4 obj”出现在每十个对象(14、24、34、1234 等)的末尾。寻找“line-4 obj-end of line”的正则表达式搜索会很棒,但我通常使用记事本,所以它已经过时了(而且我不是一个正则表达式的人)。

    PS:即使有一个漂亮的 Acrobat 插件(不是开罐器,是从前自己开发的),我仍然需要时不时地打开一个文本编辑器。

    Acrobat 有时会在加载 PDF 时进行更改(主要是为了修复问题),如果您想知道真正存在的内容,则需要以其他方式查看该 PDF。当您尝试调试损坏的 PDF 时,acrobat 的帮助是您最后需要的。

    PPS:Acrobat 在其高级->预检配置文件中也有一个漂亮的“pdf 语法检查”。它还检查了各种 PDF/* 标准(PDF/X、PDF/A-1 [a 和 b] 等)、可访问性等。当您尝试合规时,它们是无价的。不完全是您所询问的调试工具,但非常方便。

    PPPS:“区分”两个 PDF 几乎是不可能的,除非为您编写自定义工具。我写了一些东西,列出了所有页面(大小)和字段(类型、标志等)以可预测的顺序并将其转储到一个文本文件中,这样我就可以对文件进行比较......但是直接区分两个 PDF 是没有意义的。 “相同”文件有太多不同的方式(对象顺序、字典键顺序、压缩级别等)。

    【讨论】:

    • 我在github.com/itext/rups 上查看 RUPS(这是我能为 Mac 找到的少数几个选项之一),但它看起来更像是一个库,而不是一个独立的应用程序。 (它不会在任何地方调用 LicenseKey.loadLicenseFile()。)根据您的描述,我认为它是独立的,只要我有 iText 许可证。我错过了什么?
    • 来自 iText 的电子邮件明确表示没有 GUI,这与您的第二段相矛盾。也许它曾经提供过图形用户界面?我看过屏幕截图和演示,但没有最新的?如果您有 RUPS 网站提供“带有树视图的 GUI”,我希望有一个链接。
    • packages.debian.org/sid/java/libitext-rups-java 承诺提供 GUI,但我不在 Debian 系统上,我不清楚它是否与我最初在 github.com/itext/rups 找到的 iText RUPS 相同
    • @SarahMesser RUPS 带有一个 GUI。您可以从github.com/itext/rups/releases 下载它,该zip 包含几个jar(还有一个exe,我没有尝试过)。要运行它,请使用:java -jar itext-rups-5.5.9-jar-with-dependencies.jar
    • @SarahMesser 你也将 RUPS 打包在 flathub 中,无论你的 Linux 发行版如何,都可以轻松安装:flathub.org/apps/details/com.itextpdf.RUPS
    【解决方案3】:

    只需在一些文本编辑器中打开它。 PDF 实际上是一个 ASCII 文件(它可以包含嵌入的二进制数据)。

    【讨论】:

    • 据我所知,现在大多数 PDF 都打包了页面流,打开此类文件时,您可能在文本编辑器中看不到任何有用的内容。
    • 尝试打开其中的一些。或者你想让我给你发一些 PDF - 你会感到惊讶:)
    • 我想说 - 一个人问了一个问题,尝试在文本编辑器中打开文件并没有什么坏处 :) 也许可以在其中读取文件;我有很多这样的文件:)
    • Adobe 对使用对象流持保留态度。第 3 方 PDF 生成器通常默认为“常规”(如果它们完全支持)。由于这里的大多数人都没有使用 Acrobat SDK,我认为文本编辑器是一个非常有效的选择。远不是唯一的一个,而是一个完全有效的......当你有“真正的”选择时的事件(请参阅我的答案以获得解释)。
    【解决方案4】:

    好吧,我想调试一些我前几天使用 pdfLaTeX 生成的 PDF 文件,我发现 Adob​​e [Acrobat] Reader 不是很有帮助,因为我生成的稍微无效的 PDF 会像打开一样打开没问题,他们只是未能关闭。这使得 TeX/View/Edit 循环有点痛苦,因为我必须在再次进行 TeX 之前终止整个 Reader 进程。

    我使用 Ghostscript 获得了更有利的结果。就我而言,这是GSview,因为我使用的是Windows;如果我一直在使用 Linux,我会改用 gv。这不仅没有阻止我重新对文件进行 TeXing(即使它仍然处于打开状态),它也足以产生几乎无法理解的错误消息,而不是假装一切正常。这些让我稍微眯眼就能看到我在 PDF 代码中搞砸了什么,并最终生成this tex.SE answer of mine中给出的示例

    如果我能弄清楚如何告诉 Ghostscript 在错误消息中包含更多细节,那就太好了(好吧,如果我看手册的正确部分足够长的时间,我可能会这样做,实际上),但通过将 PDF 与 Ghostscript 错误消息和 Adobe's PDF reference 进行比较,并不难弄清楚我搞砸了什么。 (我链接到存档页面,因为那里的 PDF 参考完全由 Adob​​e 制作,排版质量更高,而且比主页上的 PDF 的 ISO 标准小得多。)

    当然,为了在您的文本编辑器中理解它,不压缩页面流可能很重要,所以我建议您弄清楚如何指示您的软件不要压缩它们,或者之后再找一些东西来解压它们。

    所以,简而言之:

    1. 不要使用 Adob​​e [Acrobat] Reader(除非你认为你的 PDF 很好,否则)。

    2. 使用 Ghostscript(通常通过 GSviewgv)。

    3. 请尝试指示您的软件不要压缩页面流。

    4. 请使用文本编辑器查看 PDF(最好设置为“PostScript”模式,因为语法密切相关)。

    5. 请使用the PDF reference

    【讨论】:

      【解决方案5】:

      http://blog.didierstevens.com/programs/pdf-tools/http://podofo.sourceforge.net/about.html 怎么样

      有关 PDF 工具和库的列表 - http://en.wikipedia.org/wiki/List_of_PDF_software 您可能会在那里找到适合您需求的其他工具。

      【讨论】:

        【解决方案6】:

        另一个工具是 pdfstreamdumper
        https://github.com/dzzie/pdfstreamdumper

        它实际上非常直观
        用于分析 javascript / as3 代码等 内置了很多东西
        (hexviewer / 重构(反混淆器)等)

        【讨论】:

          【解决方案7】:

          您可以使用 CanOpener、PDFedit 或 Acrobat 等工具查看 PDF 的结构(我在 http://www.jpedal.org/PDFblog/2010/09/useful-pdf-tools-pdfedit/ 写了一篇关于该主题的博客文章)

          【讨论】:

          • ...虽然我自己不使用它。我与 Windjack(出售它的公司)没有任何关系。如果你有 Acrobat,还有很多漂亮的小功能。
          猜你喜欢
          • 2021-09-21
          • 1970-01-01
          • 2022-12-16
          • 1970-01-01
          • 2014-05-13
          • 2011-07-30
          • 2013-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多