二、基于 fitz 库和正则搜索提取图片
fitz 库是 pymupdf 中的一个模块,用它来提取 pdf 里的图片非常方便。
安装命令
pipinstallfitzpipinstallpymupdf
三、代码实现
导入相关包
importfitzimportreimportos
读取 pdf 提取图片,并存储
import fitzimport timeimport reimport osdef pdf2pic(path, pic_path):t0 = time.process_time() # 生成图片初始时间checkXO = r"/Type(?= */XObject)"# 使用正则表达式来查找图片checkIM = r"/Subtype(?= */Image)"doc = fitz.open(path) # 打开pdf文件imgcount = 0# 图片计数lenXREF = doc.xref_length() # 获取对象数量长度# 打印PDF的信息print("文件名:{}, 页数: {}, 对象: {}".format(path, len(doc), lenXREF - 1))# 遍历每一个对象for i in range(1, lenXREF):text = doc.xref_object(i)# 定义对象字符串isXObject = re.search(checkXO, text) # 使用正则表达式查看是否是对象isImage = re.search(checkIM, text) # 使用正则表达式查看是否是图片if not isXObject or not isImage: # 如果不是对象也不是图片,则continuecontinueimgcount += 1pix = fitz.Pixmap(doc, i) # 生成图像对象new_name = "图片{}.png".format(imgcount) # 生成图片的名称if pix.n < 5: # 如果pix.n<5,可以直接存为PNGpix.save(os.path.join(pic_path, new_name))else: # 否则先转换CMYKpix0 = fitz.Pixmap(fitz.csRGB, pix)pix0.save(os.path.join(pic_path, new_name))pix0 = Nonepix = None# 释放资源t1 = time.perf_counter()# 图片完成时间print("运行时间:{}s".format(t1 - t0))print("提取了{}张图片".format(imgcount))if __name__=='__main__':path = r"D:\python脚本\XX.pdf"pic_path = r'D:\python脚本\图片'# 创建保存图片的文件夹if os.path.exists(pic_path):print("文件夹已存在,不必重新创建!")passelse:os.mkdir(pic_path)pdf2pic(path, pic_path)
运行结果
四、小结
Python 中 pdf2image 库也可以完成以上需求,它的好处是如果你的 pdf 页面较多时,pdf2image 可以启动多线程会大大加快转换速度,具体可参考pdf2image 官方文档。
最后,可能会遇到提取的图片比原本少,或者提取出不想要的图片。可以通过检查图片格式,可能不是常见的格式,提取时再减少或添加过滤条件进行尝试