80

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

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

4

12 回答 12

48

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

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

您应该知道 PDF 仅与演示有关,而不是结构。解析并不容易。

于 2008-09-17T23:13:19.867 回答
44

我发现GNU Introduction to PDF有助于理解结构。它包括一个易于阅读的示例 PDF 文件,他们详细描述了该文件。

其他有用的链接:

  • PDF 简洁的书更长,并且有有用的图片。
  • PDF内部介绍是一个不那么深入的演示文稿,但提供了一个快速的概述并且有很多图片。
于 2014-08-12T15:31:26.117 回答
24

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

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

于 2008-09-18T13:26:55.773 回答
10

这是 PDF 1.7的原始参考,这里是描述 PDF文件结构的文章。如果您使用 Vim,则pdftk 插件是一种探索文档的好方法,其原始形式几乎没有,而pdftk实用程序本身(及其 GPL 源代码)是一种将文档分开的好方法。

于 2008-09-17T23:18:21.197 回答
7

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

于 2009-07-09T07:13:14.460 回答
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 文件需要的不仅仅是简单的努力。

于 2011-07-30T03:54:15.950 回答
5

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

于 2013-09-17T11:54:14.020 回答
4

Didier 有一个解析 PDF 的工具:

http://didierstevens.com/files/software/pdf-parser_V0_4_3.zip

或在这里:

http://blog.didierstevens.com/programs/pdf-tools/列出了几个相关的 pdf 分析工具。

另一个工具在这里:

http://mshahzadlatif.wordpress.com/2011/09/28/view-pdf-structure-using-adobe-acrobat-or-a-free-tool-called-pdfxplorer/

于 2014-03-02T03:44:13.667 回答
2

从 PDF 中提取文本是一个难题,因为 PDF 具有这种面向布局的结构。你可以看到我在 CPAN 上勉强成功的尝试的文档和源代码(我的实现是在 Perl 中)。PDF 数据结构非常酷且设计精良,但写起来比读起来容易。

于 2008-09-19T02:51:42.237 回答
2

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

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

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

于 2010-08-24T16:52:37.777 回答
2

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

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

在此处输入图像描述

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

于 2018-12-17T08:06:36.833 回答
0

要从 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 的组合,我将尽快发布该过程。

于 2019-07-26T12:28:13.493 回答