[Python] 如何导出PDF文件中的图片

文章目录



一、背景说明

最近在看一份pdf的书籍,其中有一些图片绘制地比较出色,所以就打算将其复制出来,以便于在需要的时候进行使用。

但是令人无奈的是,pdf中的图片是无法直接另存为的。搜了一些网上的做法,要么是需要收费,要么就需要上传文件到某些网站... 总之方案都不是很理想。

偶然之下了解到Python的fitz这个组件,据说是可以导出PDF中的图片的。所以,在一番学习之下写了一个小的工具,成功导出了所需的图片。

出于备忘的需要,也为了将该方法分享给广大的小伙伴,和我一起享受从PDF中导出图片的自由,所以就有了本文的诞生。


二、代码编写

闲言少叙,直接上代码:

python 复制代码
import fitz
import os

# 打开文件
pdf_file_name = "E:/books/xxx.pdf"

# 提取图片函数
def extract_pics(file_name, extract_path):

    # 1.打开文件
    doc = fitz.open(file_name)

    #文档页数
    page_count = len(doc)
    print("文档共有{}页".format(page_count))

    # 2.遍历并检查每页的图片
    image_count = 0
    for i in range(page_count):
        # 页面对象
        page = doc[i]

        # 获取图片列表
        images = page.get_images()

        # 遍历图片
        for image in images:
            # 返回图片引用
            xref = image[0]

            # 根据引用从pdf中释放出图片
            base_image = doc.extract_image(xref)
            #获得图片数据
            image_data = base_image["image"]
            # 保存图片
            if not os.path.exists(extract_path):
                os.makedirs(extract_path)
            with open(f'{extract_path}/image_{image_count}.png', 'wb') as f:
                f.write(image_data)
                image_count = image_count + 1
    
    # 3.关闭打开的pdf
    doc.close()
    return image_count

count = extract_pics(pdf_file_name, "./pics")
print("导出 {} 张图片".format(count))

代码思路:

  • 将待导出图片的文件名,定义为一个变量。传入提取图片函数,作为第一个参数。
  • 将图片导出的目标路径作为函数的第二个参数
  • 函数所做的事情如下:
  1. 打开pdf文档。打开文档后会返回一个文档的引用,类型是fitz.Document对象。
  2. page.get_images(),会返回page对象中定义的图片列表。列表的每一个元素的结构是:[xref, smask, ...],所以说该方法的结果是数组的列表。我们可以看出:每个元素的第一个值就是xref。
  3. 所以代码 xref = image[0] 就是为了获取图片的交叉引用。

而官方文档有这么一句:

Extract the image with img = doc.extract_image(xref). This is a dictionary containing the binary image data as img"image".

来源:https://pymupdf.readthedocs.io/en/latest/recipes-images.html#how-to-extract-images-pdf-documents

就是说:通过代码 img = doc.extract_image(xref) 可以提取图片。这个方法的返回值是一个字典。通过字典的 img["image"] 可以获取二进制的图片数据 。


  1. 保存提取出图片的目录。如果目录不存在,就创建之。
  2. 使用with语句优雅地将二进制图片数据写入到指定目录中。图片的命名从0开始,并记录导出图片的数量。
  3. 最后不要忘记关闭pdf文件。释放资源。

三、问题

3.1、如何得到图片的xref?

答:

循环访问 Page.get_images() 的项目。它会返回一个列表的列表,列表元素的结构类似于 xref, smask, ...,其中第一个就是图片的交叉引用。可以通过索引获得交叉引用,如image0

3.2、xref有什么用呢?

答:可以使用 img = doc.extract_image(xref) 提取图像。img是一个 字典结构。其中 img"image" 可以返回一个++二进制图像数据++。


四、总结

本文通过Python写了一个可以导出pdf文件中图片的小工具。借助这个工具可以很容易地将pdf中的所有图片都导出到指定目录。

文中对代码的核心功能进行了讲解。并结合官方文档说明了代码为什么这么写。希望对小伙伴们有帮助!!


参考:

相关推荐
2601_962293244 小时前
Python自动化统计团队工作量并生成可视化仪表盘的脚本方案【指导】
python·数据分析·自动化·可视化·仪表盘
2601_962293795 小时前
OCRmyPDF批处理脚本:使用Python自动化复杂OCR任务
python·自动化·批处理脚本·ocrmypdf·ocr任务
Java后端的Ai之路7 小时前
20、Python - 备忘录模式
开发语言·人工智能·python·外观模式·备忘录模式
2601_962077717 小时前
基于Python与NLP的新闻事件信息抽取实战:从NER到时空标准化
python·nlp·transformers·spacy·新闻事件抽取
JavaPub-rodert8 小时前
LangChain 从入门到 Agent 实战:用 Python 搭建一个真正能调用工具和知识库的 AI 助手
人工智能·python·langchain
郝学胜-神的一滴8 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
m0_380743879 小时前
给 OpenAI API 调用加上模型切换:GPT-5.1 和 Codex 的配置实践
人工智能·python·gpt
2601_962297489 小时前
在python3中、下列输出变量a的正确写法是_2020超星大数据Python免费答案
数据结构·python·算法·编程·字符串操作
“AI国潮设计-小江”9 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
公爵爱学习9 小时前
无人机视觉识别前序-Linux-YOLO安装
python·yolo·计算机视觉·conda·无人机