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

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

安装 PDFMiner

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

$ pip3 install pdfminer

################# 运行结果 ################

Collecting pdfminerDownloading 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: pdfminerBuilding wheel for pdfminer (setup.py) ... doneStored 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 采用了一个懒惰分析的策略,就是只分析你所需要的部分。换句话就是说,根据你自己的需要只解释出你要的那部分就可以了。这里有两个核心类是必须的 PDFParser 和 PDFDocument,除了这两个模块还有以下几个模块来配合使用。

模块名

说明

下面这个图表示了 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 对象. 该对象包含该页面中的所有子对象,它们之间的关系大概如下图所示:

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

好了,了解以上对象都表示什么以后,现在我们写一段代码解析一个 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 为例做了一个简单介绍,如果想了解更多请参考文末官网介绍。

参考

python-pdfminer 官网:https://euske.github.io/pdfminer/

Python PDF Parser:https://github.com/euske/pdfminer

本文转自网络

欢迎查看个人网站:

懒人找资源-知识应当自由平等地流向每一个人​lazymovie.me

io python 读取pdf_python自动化办公之 Python 解析 PDF相关推荐

  1. python办公自动化案例-Python实战:自动化办公:Python 自动整理 Excel 表格

    相信有不少朋友日常工作会用到 Excel 处理各式表格文件,更有甚者可能要花大把时间来做繁琐耗时的表格整理工作.最近有朋友问可否编程来减轻表格整理工作量,今儿我们就通过实例来实现 Python 对表格 ...

  2. python常用库 自动化办公类 —— PyPDF2(处理pdf文件)

    python常用库 自动化办公类 -- PyPDF2(处理pdf文件) 摘要 PyPDF库的安装 PyPDF库的常用功能 文字提取 合并pdf文件 旋转pdf页面 pdf文件加密 摘要 本文主要介绍了 ...

  3. lisp对excel其他行列写入_【极简Python 自动化办公】Python写入Excel表格

    [极简Python 自动化办公]Python写入Excel表格 [极简Python 自动化办公]专栏是介绍如何利用python办公,减少工作负荷.篇幅精炼,内容易懂,无论是否有编程基础,都非常适合. ...

  4. Python八个自动化办公的技巧

    Python八个自动化办公的技巧 大家好 我是毕加锁 (锁!) 这篇文章主要介绍了几个Python自动化办公的技巧,可以大大提高工作效率,例如:Word文档doc转docx.Excel文件批量合并.W ...

  5. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——读取数据

    欢迎大家关注我,我是拾陆,关注同名"二八Data" 数据分析工作最难搞的是处理数据的过程,不然不会有专门的ETL(数据抽取.转换.加载)工程师了.如果是企业级数据处理可能数据库直接 ...

  6. io python 读取pdf_Python读取PDF文件--pdfminer

    作者使用的是Python3.6版本. pdfminer在Python2和Python3中的安装和使用有一定的区别,本文以Python为例. 首先安装pdfminer pip install pdfmi ...

  7. python自动化办公 书籍-python自动化办公知识点整理汇总

    知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? 这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手?python在自动化办公领域越来越受欢迎,批量处理 ...

  8. 【python自动化办公】Python自动化之pdf——PyPDF2、pdfplumber、fitz、pdf2image库介绍

    目录 前言 1. 学习python自动化办公目的 2. 未来持续打卡内容 3. 资料来源与思维导图 一.PDF处理库 1.PyPDF2--基础操作 2.pdfplumber--表格抽取 3.fitz- ...

  9. python自动化办公兼职-python自动化办公?学这些就够用了

    知乎上有人提问:用python进行办公自动化都需要学习什么知识呢? 这可能是很多非IT职场人士面临的困惑,想把python用到工作中,却不知如何下手? python在自动化办公领域越来越受欢迎,批量处 ...

最新文章

  1. 追梦童年,80后记忆中的Gameboy,教你怎么用模拟器去重温旧梦!
  2. C语言程序设计基础及应用实例---第一节 printf函数的使用
  3. kindle刷多看系统_疑问解答 | kindle真的能护眼吗?
  4. 动画 | 空调是怎么制冷的?
  5. .NET Core 2.0 特性介绍和使用指南
  6. 缺少必要的请求参数: id_React Hooks 第二期:发请求这件小事
  7. CSS 单词折行 word-wrap属性
  8. Android应用程序与SurfaceFlinger服务的连接过程分析
  9. Win11 BitLocker驱动器加密怎么使用
  10. 可遇不可求的Question之error: Failed dependencies: MySQLconflicts 错误篇
  11. 高并发高负载系统架构-php篇
  12. autojs之七牛直播云
  13. web-jsp 购物车(2)
  14. AndroidKK4.4 Power key电量屏幕时button light先亮LCD后亮的卡顿问题分析
  15. html光标自动定位到文本框,进入JSP页面时就将光标定位到指定的文本框中
  16. 软解码与硬解码区别linux,软解码和硬解码哪个好 软解码和硬解码有什么区别
  17. 课设系列:51单片机制作智能时钟闹钟
  18. Pycharm如何改变背景教程
  19. Prometheus 之 Alertmanager告警抑制与静默
  20. ps中海报设计的设计思路

热门文章

  1. 吉利、LG化学成立合资公司 从事电动车电池生产及销售
  2. 京东壕掷27亿买下一座酒店 官方回应:以办公为主!
  3. 拳王虚拟项目公社:说一个合法正规兼职创业,副业虚拟资源项目
  4. c++中的system函数
  5. 组态软件运行在云服务器_能在云服务器上运行软件吗
  6. textaligncenter仍然不居中_5个word你不知道的功能
  7. KubeEdge 1.2.0 部署
  8. 记一次FFMPEG转avi视频保存到ftp服务器的失败尝试
  9. oracle:oracle学习笔记(四)循环、光标、异常、瀑布模型
  10. 【Flink】Flink 报错 flink 1.12.5 启动作业报 partition not found