上次给大家介绍了 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 采用了一个懒惰分析的策略,就是只分析你所需要的部分。换句话就是说,根据你自己的需要只解释出你要的那部分就可以了。这里有两个核心类是必须的 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 为例做了一个简单介绍,如果想了解更多请参考文末官网介绍。

参考

本文转自网络

欢迎查看个人网站:懒人找资源-知识应当自由平等地流向每一个人​lazymovie.me

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

  1. python自动办公pdf_Python自动化办公实战教程2020最新带源码

    资源目录: 视频 001_Excel_xlrd读_xlwt写.mp4 003_Excel_案例_统计每位同学总分.mp4 004_MySQL_我为什么不建议学.mp4 005_Excel_更灵活的操作 ...

  2. python自动操作excel_Python自动化办公之操作Excel

    模块导入 import openpyxl 读取Excel文件 打开Excel文件 workbook = openpyxl.load_workbook("test.xlsx") 输出 ...

  3. python自动下载app_APP自动化之安装Python(类库)环境

    前言 近期在项目组在开发一款APP,所以顺势研究一下使用Appium+python做自动化测试. 一.python环境准备 首先,需要一个运行python语言的环境,就像要运行JAVA要配置JAVA环 ...

  4. python办公自动化excel_简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  5. python做excel自动化可视化-简直出神入化,教你用Python控制Excel实现自动化办公...

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  6. python excel 自动化-简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  7. python excel 自动化-Python控制Excel实现自动化办公

    这篇文章介绍了Python控制Excel实现自动化办公的方法,主要用到了xlsxwriter库,该库可以很方便的实现操作excel,利用xlsxwriter提供的方法即可使用自动化办公. Python ...

  8. python自动化办公-简直出神入化,教你用Python控制Excel实现自动化办公

    1.安装 简直出神入化,教你用Python控制Excel实现自动化办公 2.操作一个简单的Excel文档 操作注释及代码: 简直出神入化,教你用Python控制Excel实现自动化办公 操作完成后,数 ...

  9. python做excel自动化-Python控制Excel实现自动化办公

    这篇文章介绍了Python控制Excel实现自动化办公的方法,主要用到了xlsxwriter库,该库可以很方便的实现操作excel,利用xlsxwriter提供的方法即可使用自动化办公. Python ...

  10. Python骚操作:Python控制Excel实现自动化办公!

    Python骚操作:Python控制Excel实现自动化办公! 1.安装 Python骚操作:Python控制Excel实现自动化办公! 2.操作一个简单的Excel文档 操作注释及代码: Pytho ...

最新文章

  1. objective-C NSNotificationCenter (通知)的使用方法
  2. python使用符号#表示单行注释-Python中注释(多行注释和单行注释)的用法实例...
  3. 语言特性与API设计
  4. ios动态获取UILabel的高度和宽度
  5. CSS如何实现”右部宽度固定,左部自适应“的布局
  6. linux下查看mysql数据库的字段类型_系统运维|[小白技巧]如何在Linux上检查MySQL数据表的存储引擎类型...
  7. TCP/IP面试常考题目
  8. 算法分析-动态规划-01背包
  9. 拥抱SQLAlchemy 之二 拉拉手,我请你去看电影~
  10. 游戏中植入广告的例子
  11. 光纤通信是不是计算机类的,光纤通信专业属于什么门类
  12. unity如何往下挖地形_Unity 地形
  13. 四级高频词汇360个
  14. 前嗅ForeSpider数据采集软件使用教程
  15. unity 烘焙模式——baked indirect/shadow mask/distance shadowmask/subtractive模式的区别
  16. linux下安装nvm
  17. 运放-运算放大器经典应用电路大全-应用电路大全-20种经典电路
  18. 还在纠结交易系统的细节吗?看这篇文章就够了!
  19. ice java例子,ICE java 范例
  20. 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!

热门文章

  1. 如何看懂财务报表:(一)如何下载财报
  2. 计算关联系数matlab,matlab相关性系数【excel中的相关系数是如何计算出来的?】
  3. sql-in查询-元素超过1000条解决方案
  4. 方法重载和重写的区别
  5. 【图像融合】基于matlab小波变换灰色图像融合(含相关性、信噪比)【含Matlab源码 1841期】
  6. 光学图像、SAR图像等区别
  7. Mac 安装非信任开发者软件
  8. mongodb mongoose 的使用
  9. 怎么制作GIF微信表情
  10. 直流电机/步进电机/舵机区别