PDF文件的结构?[关闭]


71

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

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

Answers:



35

我发现GNU PDF入门对理解结构很有帮助。它包括一个易于阅读的示例PDF文件,它们以完整的详细描述。

其他有用的链接:


GNU链接过时了
2015年

5
@dwarring我用后代的webarchive链接修复了它们。
vard

Adobe不再像以前那样托管简介。寻找它时,我在这里找到了它:mafiadoc.com/slides_59c4bd4c1723dd6ff3e29059.html
LAFK说,莫妮卡(Monica)

24

刚开始使用PDF时,我发现很难浏览PDF参考。它可能会帮助您了解在语法中找到了文件结构的概述,并且Adobe称其为文档结构是对象结构而不是文件结构。这也可以在语法中找到。附录A中隐藏了运算符的描述-对理解内容流中正在发生的事情非常有用。如果您有使用色彩空间的烦恼,您会发现它隐藏在图形中!希望这些指针可以帮助您比我更快地找到事物。

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


1
+1。看起来CosEdit是一个很棒的入门浏览器,虽然不完美,但比尝试通过原始二进制文件进行grep更好。:/
Jason S

我下载了CosEdit,但拒绝了我的PDF。其他程序也接受相同的PDF。CosEdit可能是正确的,但这并不能帮助我确定PDF出了什么问题。
LarsH 2013年

10

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


1
原始参考似乎毫无意义。它只包含一个页面?
Carcamano '16

@Carcamano原始参考是一个(大)包,带有许多附件。第一个附件描述了PDF格式,长1310页。
banbh


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文件似乎需要付出更多努力。


4

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


1
PDFMiner很棒。特别尝试一下pdf2txt -t html -d -Y exact -o foo.html foo.pdf。这是查看PDF页面结构的非常不错的工具。我还在为自己的项目进行一些改进。
LarsH 2013年


2

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


2

获得一些线索的一种方法是创建一个由空白页组成的PDF文件。我的计算机上装有CutePDF Writer,并制作了一页空白的Wordpad文档。打印到.pdf文件,然后使用记事本打开.pdf文件。

接下来,使用该文件的副本并消除可能感兴趣的行或文本块,然后将其重新加载到Acrobat Reader中。您会惊讶地制作出一页有效的PDF文档所需的信息很少。

我正在尝试组成一个电子表格,以通过代码创建PDF表单。


0

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

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

在此处输入图片说明

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


PDF已经成为ISO标准已有10年了。因此,难道不是建议从ISO文档开始而不是从Adobe PDF Reference开始,特别是因为Adobe免费发布了一份ISO 32000-1副本(带有交换的页眉)?
mkl

首先,PDF参考手册将使您对基础知识有很好的理解。掌握它们后,您可以阅读ISO,这将使您了解为何进行了一些更改。阅读《参考手册》时,基本解析仍将相同。作为建议,最好也阅读手册的多个版本,因为它们有时会进行细微的更改。
juFo

确实,阅读某个主题的文档的不同版本可能很有意义,但是在我看来,应该从当前版本开始,而不是陈旧的版本。
mkl

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.