三种方法,Python轻松提取PDF中全

来源:早起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库的两种方法

一看名字就知道这个库的用处了,官方文档为




转载请注明:http://www.jiaju1314.com/jbjj/jbjj/17429.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了