来源:早起Python
作者:陈熹、刘早起
有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以轻松搞定!
今天就跟大家系统分享几种Python提取PDF图片的方法。其实没有非常完美的方法,每种方法提取效率都不是百分之百,因此可以考虑用多种方法进行互补,主要将涉及:
基于fitz库和正则搜索提取图片基于pdf2image库的两种方法提取图片
1.基于fitz库和正则搜索
fitz
是
pymupdf
的子模块,需要先用命令行安装
pymupdf:
pipinstallpymupdf
但注意导入时使用
importfitz
导入模块!
下面的代码就利用
fitz
库提取图片需要通过正则匹配图片元素,将模板元素转化为像素后再以图片形式写出
importfitzimportreimportosfile_path=rC:\xxx\xxx.pdf#PDF文件路径dir_path=rC:\xxx#存放图片的文件夹defpdf2image1(path,pic_path):checkIM=r/Subtype(?=*/Image)pdf=fitz.open(path)lenXREF=pdf._getXrefLength()count=1foriinrange(1,lenXREF):text=pdf._getXrefString(i)isImage=re.search(checkIM,text)ifnotisImage:continuepix=fitz.Pixmap(pdf,i)new_name=fimg_{count}.pngpix.writePNG(os.path.join(pic_path,new_name))count+=1pix=Nonepdf2image1(file_path,dir_path)
运行提取示例文件后结果如下:
可以看到,有一些很小的色块也被提取成图片,那么怎么过滤掉它们呢?
有一个简单的方法是通过大小过滤,
pix
像素在
fitz
库中存在一个重要的方法
pix.size
可以反映像素多少,简单的色素块该值较低,可以通过设置一个阈值过滤。以阈值为例过滤:
importfitzimportreimportosfile_path=rC:\xxx\xxx.pdf#PDF文件路径dir_path=rC:\xxx#存放图片的文件夹defpdf2image1(path,pic_path):checkIM=r/Subtype(?=*/Image)pdf=fitz.open(path)lenXREF=pdf._getXrefLength()count=1foriinrange(1,lenXREF):text=pdf._getXrefString(i)isImage=re.search(checkIM,text)ifnotisImage:continuepix=fitz.Pixmap(pdf,i)ifpix.size:#在这里添加一处判断一个循环continue#不符合阈值则跳过至下new_name=fimg_{count}.pngpix.writePNG(os.path.join(pic_path,new_name))count+=1pix=Nonepdf2image1(file_path,dir_path)
可以看到,全部图片都被正常提取!
2.基于pdf2image库的两种方法
一看名字就知道这个库的用处了,官方文档为