我的知识记录

Python读取PDF全部图片 一键提取教程

用Python+PyPDF2把PDF里嵌入的所有图片批量抽出来保存为PNG/JPG,按页码命名,整理素材不再逐页截图。

场景痛点

PDF里经常嵌入大量示意图、产品图、截图,需要单独拿出来用在PPT或文章里。手动操作只能一页页打开、右键另存、截图,分辨率还会被压缩。用Python脚本把整本PDF里的图片全部抽出来,按"页码-序号"命名,自动去重,几秒钟搞定。

用到的库

pip install PyPDF2 Pillow

完整代码

# -*- coding: utf-8 -*-
"""
提取 PDF 中嵌入的所有图片
"""
import os
from PyPDF2 import PdfReader
from PIL import Image
import io


def extract_images(pdf_path: str, out_dir: str = "./pdf_images") -> None:
"""
把 PDF 每一页里嵌入的图片都保存下来
:param pdf_path: 源 PDF 路径
:param out_dir: 输出图片目录
"""
os.makedirs(out_dir, exist_ok=True)
reader = PdfReader(pdf_path)
saved_count = 0

for page_idx, page in enumerate(reader.pages, start=1):
# page.images 是该页所有图片资源对象
for img_idx, img in enumerate(page.images, start=1):
# img.name 类似 "Im4.jpg",img.data 是二进制字节流
try:
# 用 Pillow 打开字节流,统一转成 PNG 保存,避免 jpg/png 混在一起
pil_img = Image.open(io.BytesIO(img.data))
out_path = os.path.join(
out_dir, f"p{page_idx:03d}_{img_idx}_{img.name.split('.')[0]}.png"
)
pil_img.save(out_path)
saved_count += 1
except Exception as e:
print(f"第{page_idx}页第{img_idx}张图片保存失败: {e}")

print(f"共保存 {saved_count} 张图片到 {out_dir}")


if __name__ == "__main__":
extract_images("with_images.pdf")

代码讲解

  • PdfReader 打开PDF,遍历 reader.pages
  • 每个 page 对象都有 .images 属性,是该页嵌入的 XObject 图片资源列表,不需要自己解析流。
  • img.data 是图片的二进制内容,用 io.BytesIO 包一下交给 Pillow 打开,再统一存成 PNG。
  • 文件名带页码和序号(p001_1_Im4.png),方便知道图片来自哪一页。
  • try/except 兜底,遇到蒙版图、特殊颜色空间图不会让整个脚本挂掉。

运行结果

./pdf_images/ 目录下生成所有图片,文件名格式 p页码_序号_内部名.png。打开即可看到PDF里的原图分辨率版本。

注意事项

  • 这里提取的是PDF内部嵌入的位图,矢量图形(线条、图表)不会被提取为图片。
  • 同一张图片如果在PDF里被多页复用,会在每页重复出现一次,需要的话按 hash 去重。
  • CMYK 颜色空间的图片Pillow保存时可能报错,可先 convert("RGB")
  • 整页扫描件本质就是一张大图,这种"图片"也会被提取出来。

Python读取PDF全部图片 一键提取教程

标签:

更新时间:2026-09-14 21:38:55

上一篇:Python提取PDF指定页面为新文件 方法详解

下一篇:Python PDF提取目录书签 大纲导出教程