虽然您可能需要提取一个或多个PDF文件中的图像,但在线网站上实现可能会导致图像泄漏,手动操作很麻烦,但实际上在Python中也很容易做到。
今天我要和系统分享几个Python提取PDF图像的方法。 其实没有非常完美的方法,任何方法的提取效率都不是100%,所以可以考虑用各种方法来补充。 主要包括基于fitz库和基于正则搜索提取图像的pdf2image库两种方法提取图像
基于fitz库和正则搜索
fitz是pymupdf的子模块,必须首先从命令行安装pymupdf。
pip install pymupdf
但是,请注意,您将使用import fitz导入模块进行导入。
在下面的代码中,要使用fitz库提取图像,必须使图像元素正常匹配,将模板元素转换为像素,然后将其作为图像进行书写
import fitz
导入re
import os
file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径
dir_path=r'C:xxx' #用于存储图像的文件夹
defPDF2image1(path,pic_path ) :
checkIM=r'/Subtype?=*/Image ('
pdf=fitz.open(path )
lenXREF=pdf._getXrefLength (
count=1
forIinrange(1,lenXREF ) :
text=pdf._getxrefstring(I ) )
isimage=re.search(checkim,text ) ) ) ) ) ) ) ) ) )。
if not isImage:
continue
pix=fitz.pixmap(pdf,I ) )。
new_name=f'img_{count}.png '
pix.writepng(OS.path.join ) pic_path,new_name ) )
count =1
pix=None
PDF2image1(file_path,dir_path ) ) ) ) ) ) ) ) )。
执行示例文件提取的结果如下:
你可以看到,一些小色块也被提取为图像,你怎么过滤它们?
有一种按大小过滤的简单方法。 pix像素在fitz库中有一个重要的方法。 pix.size反映像素的数量。 简单的色素块这个值很低,可以通过设定阈值进行过滤。 以阈值10000为例进行过滤:
import fitz
导入re
import os
file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径
dir_path=r'C:xxx' #用于存储图像的文件夹
defPDF2image1(path,pic_path ) :
checkIM=r'/Subtype?=*/Image ('
pdf=fitz.open(path )
lenXREF=pdf._getXrefLength (
count=1
forIinrange(1,lenXREF ) :
text=pdf._getxrefstring(I ) )
isimage=re.search(checkim,text ) ) ) ) ) ) ) ) ) )。
if not isImage:
continue
pix=fitz.pixmap(pdf,I ) )。
if pix.size 10000: #在此添加一处判断一个循环
如果continue #不匹配阈值,请向下跳转
new_name=f'img_{count}.png '
pix.writepng(OS.path.join ) pic_path,new_name ) )
count =1
pix=None
PDF2image1(file_path,dir_path ) ) ) ) ) ) ) ) )。
你会发现所有的图像都被正常提取了!
两种基于pdf2image库的方法
看名字就知道这个库的有用性。 官方文档为https://www.cn python.com/pypi/pdf 2image
虽然可以很容易地在pip install pdf2image中安装,但实际上poppler是一个可以正常工作的转换器,因此需要额外的安装和配置。 windows用户必须安装poppler for Windows,并且必须安装poppler for Mac才能将jqdty/文件夹添加到PATH Mac用户
具体功能的代码的官方文档中也有详细的说明:
那么,让我们分别试试这两种方法。
from pdf2imageimportconvert _ from _ path,convert_from_bytes
导入模板
from pdf 2image.exceptionsimportpdfinfonotinstallederror、PDFPageCountError、PDFSyntaxError
import os
file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径
dir_path=r'C:xxx' #用于存储图像的文件夹
efPDF2image2(file_path,dir_path ) :
images=convert _ from _ path (file _ path,dpi=200 ) )。
for image in images:
ifnotOS.path.exists(dir_path ) :
OS.makedirs(dir_path ) )。
image.save (file _ pathf 'img _ { images.index ) image ) }.PNG ',' png ' ) )
PDF2image2(file_path,dir_path ) ) ) ) ) ) ) ) )。
图像提取成功。 试试第二种方法:
from pdf2imageimportconvert _ from _ path,convert_from_bytes
导入模板
from pdf 2image.exceptionsimportpdfinfonotinstallederror、PDFPageCountError、PDFSyntaxError
import os
file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径
dir_path=r'C:xxx' #用于存储图像的文件夹
efPDF2image3(file_path,dir_path ) :
images=convert _ from _ bytes (open (file _ path,' rb ' ).read ) )
for image in images:
ifnotOS.path.exists(dir_path ) :
OS.makedirs(dir_path ) )。
image.save (file _ pathf 'img _ { images.index ) image ) }.PNG ',' png ' ) )
PDF2image3(file_path,dir_path ) ) ) ) ) ) ) ) )。
发现结果与以前一致,PDF中的所有图像都将被提取!
我还要补充一下。 核心方法covert_from_bytes包含许多参数,可以自己修改。 几个一般参数总结如下。
参数
意义
pdf_path
PDF文档路径
dpi
图像质量(对于学术杂志中常见的300dpi ) ) ) ) ) ) ) )。
output_folder
将生成的图像写入文件夹,而不是直接写入内存
first_page
开始转换页数
last_page
要转换到哪个页面
fmt
图像格式。 可以指定为png,默认值为ppm
thread_count
可以参与转换的线程数
userpw
PDF密码
output_file
输出文件名
poppler_path
指定portlet的安装路径。 如果先进行配置,则无需指定
有趣的是,能够启动多线程的thread_count参数可以大大提高转换速度,尤其是在有很多PDF页面的情况下。 感兴趣的读者可以试试。
以上是用python的三种方法提取pdf中图像的详细内容。 有关python提取pdf中图像的信息,请参阅自由资源网上的其他相关文章。