要解析PDF文件,获取其中的数据,那么了解PDF的数据结构是很有必要的一件事。
①document content文档内容,是在它们之间具有链接的多个对象,形成有向图。这些对象描述了文档的结构(页面,元数据,字体和资源)。
②page content页面内容,描述了使用一系列操作符将文本和图形放在一个页面上。
③file structure文件结构,包括header(文件头),trailer(文件尾)和交叉引用表,帮助程序找到并读取文件的内容。
PDF文件可以拆分为上述部分,对于我们来说,主要偏向于Document Catalog部分,这部分包含了PDF中的各种数据,我们可以提取文本数据、增减水印等等。
概念:文档目录是主对象图的根对象,可以通过间接引用从中到达所有其他对象。
主要关注两个部分:Page Tree 和 Document Outline。Page Tree其实就是页面对象集合,Document Outline 这个就是书签,俗称就是目录,与WPS中自动生成的目录相似。
Python去读PDF文件第三方包介绍:
pdfplumber可以对PDF文件进行读取,读取后得到一个 pdfplumber.pdf.PDF 对象,而不是Document对象,里面包含有pages方法,但是没有获取书签的的方法。
pdfplumber官方文档介绍:pdfplumber/README-CN.md at stable · hbh112233abc/pdfplumber · GitHub
fitz库,底层是用P有MuPDF来读取来读取PDF文件,可以得到document对象,这个可以通过get_toc()方法来获取PDF文件的书签目录,但是需要注意的是,我尝试对PDF文件进行拆分,拆分后的PDF文件无法获取到对应的书签目录。
PyMuPDF官方文件介绍:Document - PyMuPDF 1.22.3 documentation
概念:DF文档中的页面字典汇集了使用这些指令使用的资源(字体,图像和其他外部数据)绘制图形和文本内容的说明。 它还包括页面大小,以及定义裁剪等的许多其他框
主要关注Content即可,这里面就是PDF页面的展示内容
/F0 36.0 Tf
(Hello, World!) Tj
Tj运算符就是展示的数据,对于大部分的水印其实也是通过Tj来添加
Python去除水印的第三方库:PyPDF,pdfplumber都可以。
简单介绍了一下PDF文件底层的文件结构,可以让我们在对PDF文件进行开发的时候,有一个基本的了解,那些数据是可以获取到的,不同的需求选择合适的第三方库来解决。当然每一个第三方库都有各自的优缺点,所以往往在一个需求中,为了最后拿到的数据准确性更高,选择多个库相互结合可能会更好。
如果想要更加详细的属性功能可以在参考文件中进一步了解,也许我们无需从零开始构造PDF,但是我们可以了解PDF的实现方式,这有利于在解析PDF文件的时候,知道这部分数据可以在哪里获取。
参考文件:
PDF Explained (译作《PDF 解析》) | PDF-Explained (zxyle.github.io)