Python 提取 PDF 图片的三种实用方法:fitz、pdf2image 与优化技巧

阿麦
阿麦
发布时间:2026-10-14| 5人浏览过
原创

本文详细介绍使用 Python 从 PDF 文件中提取图片的三种方法。首先讲解基于 fitz 库结合正则表达式匹配图片对象,并通过 pix.size 阈值过滤小色块;其次介绍 pdf2image 库的安装配置及 convert_from_path 与 convert_from_bytes 两种转换方式;最后补充多线程加速技巧,帮助开发者高效、安全地批量处理 PDF 图片资源。

在数据处理过程中,我们常遇到需要从单份或多份 PDF 文档中提取图片的需求。依赖在线工具存在数据泄露风险,而手动操作又过于繁琐。实际上,利用 Python 编程可以高效且安全地解决这一问题。本文将系统分享几种主流的 Python 提取 PDF 图片方案。需要注意的是,目前尚无一种方法能实现 100% 的完美提取,各方法各有优劣,建议结合使用多种方案以互补不足。主要涉及的技术方案包括:

  • 基于 fitz 库与正则表达式匹配提取
  • 基于 pdf2image 库的两种转换路径

利用 fitz 库配合正则搜索提取

fitz 作为 pymupdf 的子模块,需先通过命令行安装 pymupdf:


pip install pymupdf

注意在代码中导入时,应使用 import fitz 语句引入模块。

以下代码演示如何利用 fitz 库提取图片。该方法通过正则表达式匹配图片元素,将模板元素转换为像素数据后,以图片格式保存输出。


import fitz
import re
import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径
dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2image1(path, pic_path):
  checkIM = r"/Subtype(?= */Image)"
  pdf = fitz.open(path)
  lenXREF = pdf._getXrefLength()
  count = 1
  for i in range(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)

运行示例文件后的提取结果如下所示:

观察结果可知,部分极小的色块也被识别并提取为图片。如何有效过滤这些无效的小色块呢?

一种简单的过滤策略是基于尺寸判断。在 fitz 库中,pix 像素对象提供了一个关键属性 pix.size,用于反映像素数量。通常,无效的小色块该值较低,因此可设定阈值进行过滤。例如,以 10000 为阈值进行筛选:


import fitz
import re
import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径
dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2image1(path, pic_path):
  checkIM = r"/Subtype(?= */Image)"
  pdf = fitz.open(path)
  lenXREF = pdf._getXrefLength()
  count = 1
  for i in range(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.cnpython.com/pypi/pdf2image。

可通过 pip install pdf2image 命令进行安装,但需注意,真正起转换作用的是 poppler 工具,因此必须额外安装并配置该环境:

  • Windows 用户必须安装 poppler for Windows,并将 bin/ 文件夹路径添加到系统环境变量 PATH 中。
  • Mac 用户则需安装 poppler for Mac。

具体发挥作用的代码在官方文档中已有详细说明:

接下来,我们分别尝试这两种转换方法:


from pdf2image import convert_from_path,convert_from_bytes
import tempfile
from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError
import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径
dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2image2(file_path, dir_path):
  images = convert_from_path(file_path, dpi=200)
  for image in images:
    if not os.path.exists(dir_path):
      os.makedirs(dir_path)
    image.save(file_path + f'\img_{images.index(image)}.png', 'PNG')

pdf2image2(file_path, dir_path)

第一种方法可成功提取图片。接着测试第二种方法:


from pdf2image import convert_from_path,convert_from_bytes
import tempfile
from pdf2image.exceptions import PDFInfoNotInstalledError, PDFPageCountError, PDFSyntaxError
import os

file_path = r'C:\xxx\xxx.pdf' # PDF 文件路径
dir_path = r'C:\xxx' # 存放图片的文件夹

def pdf2image3(file_path, dir_path):
  images = convert_from_bytes(open(file_path, 'rb').read())
  for image in images:
    if not os.path.exists(dir_path):
      os.makedirs(dir_path)
    image.save(file_path + f'\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

指定 poppler 的安装路径,一开始配置好就无需指定

值得一提的是 thread_count 参数,启用多线程可显著加快转换速度,尤其在处理页面较多的 PDF 文件时效果明显。感兴趣的用户可以尝试配置。

以上即为 Python 提取 PDF 图片的三种方法详解,更多相关内容请关注本站其他技术文章。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。