【发布时间】:2010-09-10 10:56:16
【问题描述】:
对于一个小型项目,我必须解析 pdf 文件并获取其中的特定部分(简单的字符链)。我想使用 python 来做到这一点,并且我发现了几个能够以某种方式做我想做的事情的库。
但是现在经过一些研究,我想知道 pdf 文件的真正结构是什么,有人知道网上是否有规范或解释吗?我在 adobe 上找到了一个链接,但它似乎是一个死链接:(
【问题讨论】:
标签: pdf
对于一个小型项目,我必须解析 pdf 文件并获取其中的特定部分(简单的字符链)。我想使用 python 来做到这一点,并且我发现了几个能够以某种方式做我想做的事情的库。
但是现在经过一些研究,我想知道 pdf 文件的真正结构是什么,有人知道网上是否有规范或解释吗?我在 adobe 上找到了一个链接,但它似乎是一个死链接:(
【问题讨论】:
标签: pdf
这里是 Adobe 参考资料的链接
http://www.adobe.com/devnet/pdf/pdf_reference.html
您应该知道,虽然 PDF 仅与演示有关,但与结构无关。解析并不容易。
【讨论】:
我发现GNU Introduction to PDF 有助于理解结构。它包括一个易于阅读的example PDF file,他们对其进行了完整的详细描述。
其他有用的链接:
【讨论】:
当我第一次开始使用 PDF 时,我发现 PDF reference 很难导航。 它可能会帮助您了解文件结构的概述可以在语法中找到,Adobe 所说的文档结构是对象结构而不是文件结构。这也可以在语法中找到。操作符的描述隐藏在附录 A 中——对于理解内容流中发生的事情非常有用。如果您曾经为使用色彩空间而感到痛苦,您会发现它隐藏在图形中!希望这些提示能帮助您比我更快地找到东西。
如果您使用的是 windows,pdftron CosEdit 允许您浏览对象结构以了解它。有一个免费的演示版可让您检查文件但不能保存它。
【讨论】:
这是原始的 reference of PDF 1.7,这是一篇文章 describing the structure of a PDF 文件。如果你使用 Vim,pdftk plugin 是一个很好的方式来探索文档的原始形式,而pdftk 实用程序本身(及其 GPL 源)是一个很好的方式来梳理文档。
【讨论】:
我正在尝试做几乎相同的事情。 PDF 参考是一个非常难以阅读的文档。我认为This tutorial 是一个更好的开始。
【讨论】:
这可能有助于阐明一点: (来自 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 文件需要的不仅仅是路过的努力。
【讨论】:
如果您想使用 Python 解析 PDF,请查看 PDFMINER。这是迄今为止解析 PDF 文件的最佳库。
【讨论】:
pdf2txt -t html -d -Y exact -o foo.html foo.pdf。这是一个很好的工具,可以查看 PDF 页面的结构。我还在为我们自己的项目进行一些改进。
Didier 有一个解析 PDF 的工具:
http://didierstevens.com/files/software/pdf-parser_V0_4_3.zip
或这里:
http://blog.didierstevens.com/programs/pdf-tools/ 列出了几个相关的 pdf 分析工具。
另一个工具在这里:
【讨论】:
从 PDF 中提取文本是一个难题,因为 PDF 具有这种面向布局的结构。你可以看到docs and source code 我在 CPAN 上几乎没有成功的尝试(我的实现是在 Perl 中)。 PDF 的数据结构很酷,设计的很好,但是写起来比读起来容易。
【讨论】:
获得一些线索的一种方法是创建一个包含空白页的 PDF 文件。我的电脑上有CutePDF Writer,并制作了一页的空白写字板文档。打印成 .pdf 文件,然后使用记事本打开 .pdf 文件。
接下来,使用此文件的副本并删除可能感兴趣的文本行或文本块,然后在 Acrobat Reader 中重新加载。您会惊讶于制作一个有效的一页 PDF 文档所需的信息是如此之少。
我正在尝试制作一个电子表格来从代码创建一个 PDF 表单。
【讨论】:
您需要 PDF 参考手册才能开始阅读有关 PDF 文件的详细信息和结构的信息。我建议从 1.7 版本开始。
在 Windows 上,我使用免费工具 PDF Analyzer 来查看 PDF 文件的内部结构。 这将有助于您在阅读参考手册时理解。
(我隶属于PDF Analyzer,无意推广)
【讨论】:
要从 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 的组合,我将尽快发布该过程。
【讨论】: