对于一个小项目,我必须解析 pdf 文件并获取其中的特定部分(一个简单的字符链)。我想使用 python 来做到这一点,我发现了几个能够以某种方式做我想做的事情的库。
但是现在经过一些研究,我想知道 pdf 文件的真正结构是什么,有谁知道网上是否有规范或一些解释?我在 adobe 上找到了一个链接,但它似乎是一个死链接:(
对于一个小项目,我必须解析 pdf 文件并获取其中的特定部分(一个简单的字符链)。我想使用 python 来做到这一点,我发现了几个能够以某种方式做我想做的事情的库。
但是现在经过一些研究,我想知道 pdf 文件的真正结构是什么,有谁知道网上是否有规范或一些解释?我在 adobe 上找到了一个链接,但它似乎是一个死链接:(
这是 Adobe 参考资料的链接
http://www.adobe.com/devnet/pdf/pdf_reference.html
您应该知道 PDF 仅与演示有关,而不是结构。解析并不容易。
我发现GNU Introduction to PDF有助于理解结构。它包括一个易于阅读的示例 PDF 文件,他们详细描述了该文件。
其他有用的链接:
当我第一次开始使用 PDF 时,我发现PDF 参考非常难以浏览。它可能会帮助您了解文件结构的概述可以在语法中找到,Adobe 所说的文档结构是对象结构而不是文件结构。这也可以在语法中找到。操作符的描述隐藏在附录 A 中——对于理解内容流中发生的事情非常有用。如果您曾经为使用色彩空间而感到痛苦,您会发现它隐藏在图形中!希望这些提示能帮助您比我更快地找到东西。
如果您使用的是 windows,pdftron CosEdit允许您浏览对象结构以了解它。有一个免费的演示版可让您检查文件但不能保存它。
这是 PDF 1.7的原始参考,这里是描述 PDF文件结构的文章。如果您使用 Vim,则pdftk 插件是一种探索文档的好方法,其原始形式几乎没有,而pdftk实用程序本身(及其 GPL 源代码)是一种将文档分开的好方法。
我正在尝试做几乎相同的事情。PDF 参考是一个非常难以阅读的文档。我认为本教程是一个更好的开始。
这可能有助于阐明一点:(来自 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 文件的最佳库。
Didier 有一个解析 PDF 的工具:
http://didierstevens.com/files/software/pdf-parser_V0_4_3.zip
或在这里:
http://blog.didierstevens.com/programs/pdf-tools/列出了几个相关的 pdf 分析工具。
另一个工具在这里:
从 PDF 中提取文本是一个难题,因为 PDF 具有这种面向布局的结构。你可以看到我在 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 的组合,我将尽快发布该过程。