百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

Python 解析 PDF

yuyutoo 2025-01-21 22:36 1 浏览 0 评论

上次给大家介绍了 Python 如何操作 Word 和 Excel ,而今天想为大家再介绍下,用 Python 如何解析 PDF ,PDF 格式不像前面两个那么规范,从它的表现来看,它更像是一张图片,在一张白纸上把内容摆放在固定的位置上,没有逻辑结构。不过还是那句话,可以先了解下都能实现什么功能,以备不时之需。

正是因为 PDF 没有统一的规范,也没有逻辑结构,比如句子或段落,并且不能自适应页面大小的调整。今天要介绍的 PDFMiner 尝试通过猜测它们的布局来重建它们的结构,但是并不能保证一定能识别成功,尤其是对图片和表格的识别处理会差一些。

安装 PDFMiner

解析 PDF 需要用到 pdfminer 库,目前最新版本只支持 Python3.6 及以上 ,执行如下安装命令:

$ pip3 install pdfminer

################# 运行结果 ################
Collecting pdfminer
  Downloading https://files.pythonhosted.org/packages/71/a3/155c5cde5f9c0b1069043b2946a93f54a41fd72cc19c6c100f6f2f5bdc15/pdfminer-20191125.tar.gz (4.2MB)
     |████████████████████████████████| 4.2MB 2.8MB/s 
Collecting pycryptodome (from pdfminer)
  Downloading https://files.pythonhosted.org/packages/cc/a6/f7e09ad45296eff20bd1db5aa14b1c9ea06826dd68eb2a7a27572c71d581/pycryptodome-3.9.4-cp37-cp37m-macosx_10_6_intel.whl (10.1MB)
     |████████████████████████████████| 10.1MB 1.6MB/s 
Building wheels for collected packages: pdfminer
  Building wheel for pdfminer (setup.py) ... done
  Stored in directory: /Users/mjg/Library/Caches/pip/wheels/e1/00/af/720a55d74ba3615bb4709a3ded6dd71dc5370a586a0ff6f326
Successfully built pdfminer
Installing collected packages: pycryptodome, pdfminer
Successfully installed pdfminer-20191125 pycryptodome-3.9.4

OK,如果提示以上信息则安装成功。

解析概述

由于PDF文件有如此大和复杂的结构,完整解析 PDF 文件很费时费力的。因此 PDFMiner 采用了一个懒惰分析的策略,就是只分析你所需要的部分。换句话就是说,根据你自己的需要只解释出你要的那部分就可以了。这里有两个核心类是必须的 PDFParserPDFDocument,除了这两个模块还有以下几个模块来配合使用。

模块名

说明

PDFParser

从文件中获取数据

PDFDocument

存储文档数据结构到内存中

PDFPageInterpreter

解析page内容

PDFDevice

把解析到的内容转化为你需要的东西

PDFResourceManager

存储共享资源,例如字体或图片等

下面这个图表示了 PDFMiner 各模块之间的关系,让我们能有个基本的认识:

基本用法

首先我准备了一个 pdf 格式的文档,内容基本如下图这样:

下面这段代码给出了 PDFMiner 解析 PDF 文档的基本方法,首先打开 pdf 文件,创建解析对象,存储文档结构,创建资源管理对象以及共享资源,然后再创建 device 对象,最后再创建文档解析对象,并处理文档中的每一页。是不是看起来很复杂,不过确实也挺麻烦,还是让我们直接看代码吧。

# pdf_1.py

# 导入库
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator

# 设置文档密码
password = ''

#打开pdf文件
fp = open('pdfminer.pdf','rb')

#从文件句柄创建一个pdf解析对象
parser = PDFParser(fp)

#创建pdf文档对象,存储文档结构
document = PDFDocument(parser,password)

#创建一个pdf资源管理对象,存储共享资源
rsrcmgr = PDFResourceManager()

#创建一个device对象
device = PDFDevice(rsrcmgr)

#创建一个解释对象
interpreter = PDFPageInterpreter(rsrcmgr, device)

#处理包含在文档中的每一页
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)

这样就完成了将页面对象加载的操作,下面通过命令 python pdf_1.py 运行程序,没有报错就说明页面信息已经成功加载至内存,然后我们就得想办法分别解析各类型信息,那都有哪些类型的对象呢?

解析对象

布局分析器把 pdf 文档中每一页返回为一个 LTPage 对象. 该对象包含该页面中的所有子对象,它们之间的关系大概如下图所示:

接下来我再列出一个表格具体说明下各对象:

对象名

对象说明

备注

LTPage

代表一个完整的页面,可以包含子对象

例如:LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine

LTTextBox

它包含 LTTextLine 对象的列表,代表一组被包含在矩形区域中的文本

注意:该box是根据几何学分析得到的,并不一定准确地表现为该文本的逻辑范围,get_text()方法可以返回文本内容

LTTextLine

包含一个LTChar对象的列表,表现为单行文本

字符表现为一行或一列,取决于文本书写方式,get_text()方法返回文本内容

LTChar

表示一个在文本中的真实的字母,作为一个unicode字符串

LTChar 对象有真实的分隔符

LTAnno

表示一个在文本中的真实的字母,作为一个unicode字符串

LTAnno 对象没有,是虚拟分隔符,按照两个字符之间的关系,布局分析器插入虚拟分隔符

LTFigure

表示一个被 PDF Form 对象使用的区域

pdf form适用于目前的图表(present figures)或者页面中植入的另一个pdf文档图片,LTFigure对象可以递归

LTImage

表示一个图形对象,可以是JPEG或者其他格式

但 PDFMiner 目前没有花太多精力在图形对象上

LTLine

表示一根直线

用来分割文本或图表(figures)

LTRect

表示一个矩形

用来框住别的图片或者图表

LTCurve

代表一个贝塞尔曲线

好了,了解以上对象都表示什么以后,现在我们写一段代码解析一个 pdf 并打印出来所解析的内容。

# pdf_2.py

# 导入库
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfpage import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
from pdfminer.layout import *
from pdfminer.converter import PDFPageAggregator

# 提供初始密码
password = ''
# 没有密码可以初始密码
# document.initialize()

#打开pdf文件
fp = open('pdfminer.pdf','rb')

#从文件句柄创建一个pdf解析对象
parser = PDFParser(fp)

#创建pdf文档对象,存储文档结构
document = PDFDocument(parser, password)

#创建一个pdf资源管理对象,存储共享资源
rsrcmgr = PDFResourceManager()

laparams = LAParams()

#创建一个device对象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)

#创建一个解释对象
interpreter = PDFPageInterpreter(rsrcmgr, device)

#处理包含在文档中的每一页
for page in PDFPage.create_pages(document):
    interpreter.process_page(page)
    layout = device.get_result()
    for x in layout:
        # 获取文本对象
        if isinstance(x, LTTextBox):
            print(x.get_text().strip())
        # 获取图片对象
        if isinstance(x,LTImage):
            print('这里获取到一张图片')
        # 获取 figure 对象
        if isinstance(x,LTFigure):
            print('这里获取到一个 figure 对象')

OK,这次我们把 pdf 文件加载到内存后,循环加载到每个页面对象,并遍历各个对象,使用 isinstance 方法判断对象的类型,将文本对象时直接打印出来,当为其他对象时打印一个字符串,返回结果如下图:

可以看出 PDFMiner 对文本的解析还是不错的,不过对图片的解析,正如官方文档所说,识别并不是很准确,这里将图片识别为了 figure 对象。另外对于表格的支持也不够好,虽然能读取出来表格内容,但完全看不出表格的样式来,后期还需要进一步处理。

总结

本文为大家介绍了 Python 中如何解析 PDF 文档,由于 PDF 并没有规范的格式,解析起来会比较复杂。当然除了 PDFMiner ,还有很多处理 pdf 的工具,各有优缺点,今天算是带大家入个门,就以 PDFMiner 为例做了一个简单介绍,如果想了解更多请参考文末官网介绍。

相关推荐

建筑福利-pdf转dwg格式转换器,再也不用描图-极客青年

作为一名经常熬夜画图的建筑狗或者cad用户,你体验过pdf图纸描图到cad吗?前几天一个老同学找我,说他的毕业设计需要我帮忙,发给我一份pdf图纸文件,问我怎么把pdf图纸转换成dwg格式。机智的我灵...

想学 HTML,不知从何入手?看完这篇文章你就知道了

很多人都说HTML是一门很简单的语言,看看书,看看视频就能读懂。但是,如果你完全没有接触过,就想通过看一遍教程,背背标签,想要完全了解HTML,真的有点太天真了。HTML中文...

「前端」HTML之结构

今天继续为大家分享前端的知识,如果对前端比较感兴趣的小伙伴,可以关注我,我会更大家继续分享更多与前端相关的内容,当然如果内容中又不当的或者文字错误的,欢迎大家在评论区留言,我会及时修改纠正。1.初识H...

手把手教你使用Python网络爬虫下载一本小说(附源码)

大家好,我是Python进阶者。前言前几天【磐奚鸟】大佬在群里分享了一个抓取小说的代码,感觉还是蛮不错的,这里分享给大家学习。...

用于处理pdf文件格式的转换器

在上传过程中如果单个文件太大则容易中断,而且文件太大的话对与存储也有些弊端。那么我们应该想到将文件进行压缩(注意这里压缩指的是不改变文件格式的压缩,而不是用变成压缩文件。这里就将以下用专门的软件压缩P...

乐书:在线 Kindle 电子书制作和转换工具

之前Kindle伴侣曾推荐过可以在Windows和Mac系统平台上运行的kindle电子书制作软件Sigil(教程),用它可以制作出高质量的的ePub格式电子书,当然最后还需要通...

付费文档怎么下载?教你5种方法,任意下载全网资源

网上查资料的时候,经常遇到需要注册登录或者付费的才能复制或者是下载,遇到这种情况大多数人都会选择重新查。...

捡来的知识!3种方法随便复制网页内容,白嫖真香呀

网上的资源真的多,所以许多人常常会从网上找资料。我们看到感兴趣的内容,第一时间可能会想要收入囊中。比如说截个图啊,或者挑选有意思的句子复制粘贴,记录下来。可是,有些时候,却会遇到这样的情况:1、内容不...

AI的使用,生成HTML网页。

利用deepseek,豆包,kimi以及通义千问,写入相同的需求。【写一个网页,实现抽奖功能,点击“开始”,按键显示“停止”,姓名开始显示在屏幕上,人员包括:“张三”,“里斯”,“Bool”,“流水废...

pdf转换成jpg转换器 4.1 官方正式版

pdf转换成jpg工具软件简介pdf转换成jpg转换器是一款界面简洁,操作方便的pdf转换成jpg转换器。pdf转换成jpg转换器可以将PDF文档转换为JPG,BMP,GIF,PNG,TIF图片文件。...

办公必备的office转换成pdf转换器怎么用?

2016-02-2415:53:37南方报道网评论(我要点评)字体刚从校园走出社会,对于快节奏的办公环境,难免会觉得有些吃力。在起步阶段力求将手头上的事情按时完工不出错,但是渐渐的你会发现,别人只...

为什么PDF转Word大多要收费?

PDF转Word大多都要收费?并非主要是因为技术上的难度,而是基于多方面的商业和版权考虑的,下面给大家浅分析下原因:...

如何用python生成简单的html report报告

前提:用python写了一个简单的log分析,主要也就是查询一些key,value出来,后面也可以根据需求增加。查询出来后,为了好看,搞个html表格来显示。需要的组件:jinja2flask...

学用系列|如何搞定word批量替换修改和格式转换?这里一站搞定

想必不少朋友都会碰到批量修改word文档内容、压缩文档图片、文件格式转换等重复性文档处理工作的需要,今天胖胖老师就推荐给大家一个免费工具XCLWinKits,一站搞定你所有的需要。什么是XCLWinK...

这款PDF文档转换神器,能帮你解决PDF使用中的许多难点

不管是平时的学习还是工作,相信许多朋友都经常接触PDF文件。可以说,PDF文件在我们的日常办公学习过程中的重要性和Word文档一样重要。在之前的更新中,小编介绍了几款非常不错的PDF文档格式转换软件,...

取消回复欢迎 发表评论: