【问题标题】:Structure of a PDF file? [closed]PDF文件的结构? [关闭]
【发布时间】:2010-09-10 10:56:16
【问题描述】:

对于一个小型项目,我必须解析 pdf 文件并获取其中的特定部分(简单的字符链)。我想使用 python 来做到这一点,并且我发现了几个能够以某种方式做我想做的事情的库。

但是现在经过一些研究,我想知道 pdf 文件的真正结构是什么,有人知道网上是否有规范或解释吗?我在 adobe 上找到了一个链接,但它似乎是一个死链接:(

【问题讨论】:

    标签: pdf


    【解决方案1】:

    这里是 Adob​​e 参考资料的链接

    http://www.adobe.com/devnet/pdf/pdf_reference.html

    您应该知道,虽然 PDF 仅与演示有关,但与结构无关。解析并不容易。

    【讨论】:

    【解决方案2】:

    我发现GNU Introduction to PDF 有助于理解结构。它包括一个易于阅读的example PDF file,他们对其进行了完整的详细描述。

    其他有用的链接:

    【讨论】:

    • GNU 链接已经过时
    • @dwarring 我用网络存档链接修复了它们以供后代使用。
    • Adobe 不再像以前那样托管介绍性的 preso。找它,我在这里找到它:mafiadoc.com/slides_59c4bd4c1723dd6ff3e29059.html
    • 您的“其他帮助链接”已失效 :(
    【解决方案3】:

    当我第一次开始使用 PDF 时,我发现 PDF reference 很难导航。 它可能会帮助您了解文件结构的概述可以在语法中找到,Adobe 所说的文档结构是对象结构而不是文件结构。这也可以在语法中找到。操作符的描述隐藏在附录 A 中——对于理解内容流中发生的事情非常有用。如果您曾经为使用色彩空间而感到痛苦,您会发现它隐藏在图形中!希望这些提示能帮助您比我更快地找到东西。

    如果您使用的是 windows,pdftron CosEdit 允许您浏览对象结构以了解它。有一个免费的演示版可让您检查文件但不能保存它。

    【讨论】:

    • +1。看起来 CosEdit 是一个很棒的介绍性浏览器,虽然不完美,但比尝试通过原始二进制文件 grep 好得多。 ://
    • 我下载了 CosEdit,但它拒绝了我的 PDF。其他程序接受相同的 PDF。 CosEdit 可能是对的,但它并不能帮助我确定我的 PDF 出了什么问题。
    【解决方案4】:

    这是原始的 reference of PDF 1.7,这是一篇文章 describing the structure of a PDF 文件。如果你使用 Vim,pdftk plugin 是一个很好的方式来探索文档的原始形式,而pdftk 实用程序本身(及其 GPL 源)是一个很好的方式来梳理文档。

    【讨论】:

    • 原始参考似乎毫无意义。它只包含一个页面?
    • @Carcamano 原始参考是一个带有许多附件的(大)包。第一个附件描述了 PDF 格式,长达 1310 页。
    【解决方案5】:

    我正在尝试做几乎相同的事情。 PDF 参考是一个非常难以阅读的文档。我认为This tutorial 是一个更好的开始。

    【讨论】:

    【解决方案6】:

    这可能有助于阐明一点: (来自 PDF32000.book 的第 11 页)

    PDF 语法最好理解为四个部分,如图 1 所示:

    • 对象。 PDF 文档是由一小组基本类型的数据对象组成的数据结构。 第 7.2 节“词汇约定”描述了用于编写对象和其他内容的字符集 句法元素。 7.3 节“对象”描述了对象的语法和基本属性。 子条款 7.3.8,“流对象”,提供了最复杂的数据类型流的完整细节 对象。

    • 文件结构。 PDF 文件结构决定了对象在 PDF 文件中的存储方式以及它们的存储方式 访问,以及它们是如何更新的。这种结构独立于对象的语义。子 第 7.5 节“文件结构”描述了文件结构。第 7.6 节“加密”描述了文件级 保护文档内容免遭未经授权访问的机制。

    • 文档结构。 PDF 文档结构指定了如何使用基本对象类型 表示 PDF 文档的组成部分:页面、字体、注释等。第 7.7 款, “文档结构”描述了整个文档结构;后面的条款详细说明 组件的语义。

    • 内容流。 PDF 内容流包含一系列描述 页面或其他图形实体。这些指令虽然也表示为对象,但在概念上是 与表示文档结构的对象不同,并单独描述。子条款 7.8,“内容流和资源”,讨论 PDF 内容流及其相关资源。

    看起来浏览 PDF 文件需要的不仅仅是路过的努力。

    【讨论】:

      【解决方案7】:

      如果您想使用 Python 解析 PDF,请查看 PDFMINER。这是迄今为止解析 PDF 文件的最佳库。

      【讨论】:

      • PDFMiner 很棒。特别是尝试pdf2txt -t html -d -Y exact -o foo.html foo.pdf。这是一个很好的工具,可以查看 PDF 页面的结构。我还在为我们自己的项目进行一些改进。
      【解决方案8】:
      【解决方案9】:

      从 PDF 中提取文本是一个难题,因为 PDF 具有这种面向布局的结构。你可以看到docs and source code 我在 CPAN 上几乎没有成功的尝试(我的实现是在 Perl 中)。 PDF 的数据结构很酷,设计的很好,但是写起来比读起来容易。

      【讨论】:

        【解决方案10】:

        获得一些线索的一种方法是创建一个包含空白页的 PDF 文件。我的电脑上有CutePDF Writer,并制作了一页的空白写字板文档。打印成 .pdf 文件,然后使用记事本打开 .pdf 文件。

        接下来,使用此文件的副本并删除可能感兴趣的文本行或文本块,然后在 Acrobat Reader 中重新加载。您会惊讶于制作一个有效的一页 PDF 文档所需的信息是如此之少。

        我正在尝试制作一个电子表格来从代码创建一个 PDF 表单。

        【讨论】:

          【解决方案11】:

          您需要 PDF 参考手册才能开始阅读有关 PDF 文件的详细信息和结构的信息。我建议从 1.7 版本开始。

          在 Windows 上,我使用免费工具 PDF Analyzer 来查看 PDF 文件的内部结构。 这将有助于您在阅读参考手册时理解。

          (我隶属于PDF Analyzer,无意推广)

          【讨论】:

          • PDF 成为 ISO 标准已有 10 年了。因此,不应该建议从 ISO 文档开始,而不是从 Adob​​e PDF 参考开始,尤其是在 Adob​​e 免费发布了 ISO 32000-1(带有交换页眉)的副本时?
          • 首先,PDF 参考手册将使您对基础知识有一个很好的理解。一旦掌握了它们,您就可以阅读 ISO,这将使您了解为什么进行了一些更改。阅读参考手册时,基本解析仍然是相同的。作为建议,最好阅读多个版本的手册,因为它们有时会做出细微的变化。
          • 确实,阅读有关某些主题的不同版本的文档是有意义的,但在我看来,应该从当前版本开始,而不是过时的版本。
          【解决方案12】:

          要从 PDF 中提取文本,请在 Linux、BSD 等机器上尝试,或者如果在 Windows 上使用 Cygwin:

          pdfinfo -layout some_pdf_file.pdf
          

          创建一个名为some_pdf_file.txt 的纯文本文件。 PDF 文件布局越简单,.txt 文件输出就越简单。

          十六进制字符经常出现在 .txt 文件输出中,并且在文本编辑器中看起来很奇怪。这些十六进制字符通常表示 PDF 中的单引号和双引号、项目符号、连字符等。

          要查看十六进制字符出现的上下文,请运行此 grep 命令,并将原始 PDF 放在手边,以查看代码在 PDF 中表示的字符:

          grep -a --color=always "\\\\[0-9][0-9][0-9]" some_pdf_file.txt
          

          这将提供文档中不同八进制代码的唯一列表:

          grep -ao "\\\\[0-9][0-9][0-9]" some_pdf_file.txt|sort|uniq
          

          要将这些十六进制字符转换为等价的 ASCII 字符,可以使用 grep、sed 和 bc 的组合,我将尽快发布该过程。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-07-18
            • 1970-01-01
            • 2019-06-14
            • 1970-01-01
            • 2016-11-20
            • 2010-09-22
            • 2014-06-26
            • 2017-01-06
            相关资源
            最近更新 更多