转载: zxdst chenx6542@foxmail.com 缩写:一半为花间酒) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )
在公众号内转载时请联系公众号:早起Python
在本例中可以学到的知识点:
使用pdf播放器从pdf中提取文本和表格
使用fitz从PDF中提取图像
以前详细说明了批量PDF文件的处理。 这包括合并、拆分、水印和加密。 处理批量PDF文件
文章中详细分析了各行的原理。 这里介绍的是面向PDF的模块很多,有些模块功能不完整,代码也不像OFFICE三点式操作那样简洁
今天学习的PDF图像的提取也是如此。 因此,多以理解为主,不需要完全掌握代码表示,只要能使用就可以了
今天说明的练习数据是年度报告,里面有很多文字、表格和照片
一.模块安装
需要安装两个模块。 第一个是pdf播放器
在Windows上调用命令行:
pip install pdfplumber
第二个是fitz,这是pymupdf的模块
在Windows上调用命令行:
pip install pymupdf
二. PDF文字提取
代码思想:
在PDFplumber中打开pdf文件
获取指定的页面或遍历每页
使用. extract_text )方法提取当前页面的文本
尝试使用上述代码提取示例数据第12页中的字符。
导入pdf播放器
file _ path=r ‘ c :\xxxx\practice.pdf ‘
withpdfplumber.openfile_path ) as pdf:
page=pdf.pages[11]
printpage.extract_text ) )
可以导入python-docx并使用Wordfile.add_paragraph )将提取的内容写入word文件
三. PDF表格提取
提取单个表的代码与使用. extract_table )提取单页字符的代码非常类似
请注意. extract_table )缺省情况下会读取指定页面上的第一个表。 如果当前页需要读取多个表,请直接使用. extract_tables ) )
例如,示例文件的第13页包含两个表。 分别使用. extract_table 和. extract_tables )观察输出情况
导入pdf播放器
file _ path=r ‘ c :\xxxx\practice.pdf ‘
withpdfplumber.openfile_path ) as pdf:
page=pdf.pages[12]
printpage.extract_table ) )
是嵌套列表,熟悉此格式的人将理解,可以使用pandas或遍历嵌套列表并使用openpyxl sheet.append list )写入Excel文件
导入pdf播放器
file _ path=r ‘ c :\xxxx\practice.pdf ‘
withpdfplumber.openfile_path ) as pdf:
page=pdf.pages[12]
printpage.extract_tables )
. extract_tables )提取当前页面中的所有表将生成三阶段嵌套列表,第一阶段列表表示每个表
四. PDF图像提取
关于图像提取,目前没有能够100%提取的模块。 这里只介绍基于fitz模块的代码,基本的想法是正则的,寻找图像并输出
import fitz
导入re
import os
file _ path=r ‘ c :\XXX\practice.pdf ‘
dir_path=r’C:\xxx’ #用于存储图像的文件夹
efpdf2picpath,pic_path ) :
checkXO=r’/Type ?=*/XObject ‘
checkIM=r’/Subtype?=*/Image ‘
pdf=fitz.openpath )
lenXREF=pdf._getXrefLength
imgcount=0
forIinrange1,lenXREF ) :
text=pdf._getxrefstringI ) )
isxobject=re.searchcheckxo,text ) ) ) ) ) ) ) ) ) )。
isimage=re.searchcheckim,text ) ) ) ) ) ) ) ) ) )。
ifnotisxobjectornotisimage :
continue
imgcount =1
pix=fitz.pixmappdf,I ) )。
new_name=f’img_{imgcount}.png ‘
if pix.n 5:
pix.writepngOS.path.join ) pic_path,new_name ) )
else:
pix0=fitz.pixmapfitz.csRGB,pix ) )。
pix0.writepngOS.path.join ) pic_path,new_name ) )
pix0=None
pix=None
pdf2picfile_path,dir_path ) )。
图像提取成功,但PDF中的图像还不止这些。 欢迎感兴趣的读者交流