前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用 Python 批量提取 PDF 的图片,并存储到指定文件夹

用 Python 批量提取 PDF 的图片,并存储到指定文件夹

作者头像
杰哥的IT之旅
发布2022-05-17 17:12:28
1.8K0
发布2022-05-17 17:12:28
举报
文章被收录于专栏:GitHub专栏

本期视频:用 Python 批量提取 PDF 中的图片,并保存到指定文件夹中!

上篇《用 Python 批量提取 PDF 的表格数据,保存为 Excel》文章中,我们利用 Python 的第三方工具库 pdfplumber 批量提取 PDF 的表格数据后,有不少小伙伴们提出,大多数 PDF 都为图片,如何批量提取出图片。

今天就来用 Python 来解决这个问题。

一、实现效果图

二、基于 fitz 库和正则搜索提取图片

fitz 库是 pymupdf 中的一个模块,用它来提取 pdf 里的图片非常方便。

安装命令

代码语言:javascript
复制
pip install fitz 
pip install pymupdf

三、代码实现

导入相关包

代码语言:javascript
复制
import fitz
import re
import os

读取 pdf 提取图片,并存储

代码语言:javascript
复制
def save_pdf_img(path,save_path):
    '''
    path: pdf的路径
    save_path : 图片存储的路径
    '''
    # 使用正则表达式来查找图片
    checkXO = r"/Type(?= */XObject)" 
    checkIM = r"/Subtype(?= */Image)"  
    # 打开pdf
    doc = fitz.open(path)
    # 图片计数
    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)
#         print(i,text)
        isXObject = re.search(checkXO, text)
        # 使用正则表达式查看是否是图片
        isImage = re.search(checkIM, text)
        # 如果不是对象也不是图片,则continue
        if not isXObject or not isImage:
            continue
        imgcount += 1
        # 根据索引生成图像
        pix = fitz.Pixmap(doc, i)
        # 根据pdf的路径生成图片的名称
        new_name = path.replace('\\', '_') + "_img{}.png".format(imgcount)
        new_name = new_name.replace(':', '')
        # 如果pix.n<5,可以直接存为PNG
        if pix.n < 5:
            pix.writePNG(os.path.join(save_path, new_name))
        # 否则先转换CMYK
        else:
            pix0 = fitz.Pixmap(fitz.csRGB, pix)
            pix0.writePNG(os.path.join(save_path, new_name))
            pix0 = None
        # 释放资源
        pix = None
        print("提取了{}张图片".format(imgcount))
# pdf路径
path = r'/Users/wangwangyuqing/Desktop/data/img.pdf'
save_path = r'/Users/wangwangyuqing/Desktop/data'
save_pdf_img(path,save_path)

运行结果

四、小结

Python 中 pdf2image 库也可以完成以上需求,它的好处是如果你的 pdf 页面较多时,pdf2image 可以启动多线程会大大加快转换速度,具体可参考 pdf2image 官方文档。

最后,可能会遇到提取的图片比原本少,或者提取出不想要的图片。可以通过检查图片格式,可能不是常见的格式,提取时再减少或添加过滤条件进行尝试。

本期视频:用 Python 批量提取 PDF 中的图片,并保存到指定文件夹中!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杰哥的IT之旅 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、实现效果图
  • 二、基于 fitz 库和正则搜索提取图片
  • 三、代码实现
  • 四、小结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档