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")。 - 整页扫描件本质就是一张大图,这种"图片"也会被提取出来。

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