一个功能强大的PDF批量转图片工具,支持灵活的配置选项、复杂的页数范围规则和自定义命名方案。
- ✨ 批量转换多个PDF文件
- 📁 支持文件夹递归扫描
- 🎯 灵活的页数范围配置(支持复杂的多文件规则)
- 🎨 多种图片格式支持(PNG、JPG、TIFF、BMP等)
- 📦 可选ZIP压缩输出
- 🏷️ 自定义文件命名规则
- ⚙️ YAML配置文件 + CLI参数
- 🐍 使用Conda管理环境
- Python 3.10+
- Conda(推荐使用Miniconda或Anaconda)
- Poppler(系统依赖)
PDF转图片需要系统安装Poppler:
macOS:
brew install popplerUbuntu/Debian:
sudo apt-get install poppler-utilsWindows: 下载预编译版本:https://github.com/oschwartz10612/poppler-windows/releases/
# 克隆或下载项目
cd my-pdf2img
# 使用environment.yml创建环境
conda env create -f environment.yml
# 激活环境
conda activate pdf2img如果不使用Conda,也可以用pip安装:
pip install -r requirements.txt编辑 config.yaml 文件:
output_format: png
output_quality: 95
input_path: ./input # PDF文件或文件夹
output_dir: ./output # 输出目录
zip_output: false # 是否压缩为ZIP
page_ranges: all # 页数范围
dpi: 200 # 图片分辨率运行:
python pdf2img.py --config config.yaml# 转换单个PDF
python pdf2img.py --input document.pdf --output ./images --format png
# 转换文件夹内所有PDF
python pdf2img.py --input ./pdfs --output ./images --format jpg --quality 90
# 只转换特定页面
python pdf2img.py --input file.pdf --output ./out --pages "1-3,5"
# 输出为ZIP压缩包
python pdf2img.py --input ./pdfs --output ./out --zip| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output_format |
string | png | 输出图片格式:png, jpg, jpeg, tiff, bmp |
output_quality |
int | 95 | 图片质量(1-100),仅对jpg/jpeg有效 |
input_path |
string | ./input | 输入PDF文件或文件夹路径 |
output_dir |
string | ./output | 输出文件夹路径 |
zip_output |
bool | false | 是否将每个PDF的输出压缩为ZIP |
dpi |
int | 200 | 输出图片DPI(50-600) |
支持多种灵活的页数范围配置:
使用空格分隔不同的页数范围段:
page_ranges: "all" # 所有页面
page_ranges: "odd" # 所有奇数页(1, 3, 5, 7...)
page_ranges: "even" # 所有偶数页(2, 4, 6, 8...)
page_ranges: "1-4" # 第1到第4页
page_ranges: "3" # 只转换第3页
page_ranges: "1-4 7-9 11" # 第1-4页、第7-9页、第11页
page_ranges: "1 3 5 7" # 第1、3、5、7页
page_ranges: "1-3 8-10" # 第1-3页和第8-10页使用逗号分隔为不同PDF指定不同规则:
# 示例1: 两个PDF分别指定不同的页数范围
page_ranges: "1-4 7-9,1-4 5"- 第1个PDF: 转换第1-4页和第7-9页
- 第2个PDF: 转换第1-4页和第5页
# 示例2: 使用特殊规则标记
page_ranges: "1-4,all,-1,2,-2"规则解释:
- 第1个PDF: 转换第1-4页
- 第2个PDF: 转换所有页(逗号间为空或"all")
- 第3个PDF:
-1表示与上一个(第2个)相同,即所有页 - 第4个PDF: 只转换第2页
- 第5个及后续PDF:
-2表示后续都与上一个(第4个)相同,即第2页
示例场景:
假设有5个PDF文件,配置为 "1-4,,-1,2,-2":
| PDF编号 | 规则 | 转换页面 |
|---|---|---|
| PDF 1 | 1-4 | 第1-4页 |
| PDF 2 | (空) | 所有页 |
| PDF 3 | -1 | 所有页(同上一个) |
| PDF 4 | 2 | 第2页 |
| PDF 5 | -2 | 第2页(启用重复模式) |
更多示例:
# 3个PDF,各自指定不同的间隔页
page_ranges: "1-5 10-15,2 4 6 8,all"- PDF 1: 第1-5页和第10-15页
- PDF 2: 第2、4、6、8页
- PDF 3: 所有页
# 使用奇数页/偶数页功能
page_ranges: "odd,even"- PDF 1: 所有奇数页
- PDF 2: 所有偶数页
自定义输出文件和图片的命名方式:
naming_rules:
folder_prefix: "converted_" # 文件夹/ZIP前缀
folder_suffix: "_output" # 文件夹/ZIP后缀
image_prefix: "page_" # 图片名前缀
image_suffix: "_img" # 图片名后缀示例:
原PDF文件名:report.pdf
配置后的输出:
- 文件夹/ZIP名称:
converted_report_output - 图片文件名:
page_report_img_1.png,page_report_img_2.png, ...
如果不设置前缀/后缀(留空),则使用原文件名。
所有配置都可以通过命令行参数覆盖:
python pdf2img.py [OPTIONS]
选项:
-c, --config PATH 配置文件路径
-i, --input PATH 输入PDF文件或文件夹路径
-o, --output PATH 输出文件夹路径
-f, --format [png|jpg|jpeg|tiff|bmp]
输出图片格式
-q, --quality INTEGER 输出图片质量 (1-100)
--dpi INTEGER DPI设置 (50-600)
--zip 将每个PDF的输出压缩为ZIP文件
--pages TEXT 页数范围规则
--folder-prefix TEXT 输出文件夹/ZIP名称前缀
--folder-suffix TEXT 输出文件夹/ZIP名称后缀
--image-prefix TEXT 图片文件名前缀
--image-suffix TEXT 图片文件名后缀
--help 显示帮助信息python pdf2img.py \
--input ./documents \
--output ./images \
--format png \
--dpi 300 \
--quality 95python pdf2img.py \
--input ./reports \
--output ./archives \
--format jpg \
--quality 85 \
--zip转换PDF的特定间隔页面:
# 转换第1-4页、第7-9页和第11页
python pdf2img.py \
--input document.pdf \
--output ./output \
--pages "1-4 7-9 11"
# 只转换奇数页
python pdf2img.py \
--input document.pdf \
--output ./output \
--pages "odd"
# 只转换偶数页
python pdf2img.py \
--input document.pdf \
--output ./output \
--pages "even"
# 手动指定奇数页
python pdf2img.py \
--input document.pdf \
--output ./output \
--pages "1 3 5 7 9 11 13 15"假设有3个PDF需要不同的页数处理:
# 方式1: 使用空格分隔每个PDF内的不同页数范围
python pdf2img.py \
--input ./pdfs \
--output ./output \
--pages "1-3 8-10,all,2 4 6"- 第1个PDF:转换第1-3页和第8-10页
- 第2个PDF:转换所有页
- 第3个PDF:转换第2、4、6页
# 方式2: 使用奇数页/偶数页关键字
python pdf2img.py \
--input ./pdfs \
--output ./output \
--pages "odd,even,all"- 第1个PDF:转换所有奇数页
- 第2个PDF:转换所有偶数页
- 第3个PDF:转换所有页
# 方式3: 使用-1和-2标记
python pdf2img.py \
--input ./pdfs \
--output ./output \
--pages "1-3,all,-1"- 第1个PDF:转换第1-3页
- 第2个PDF:转换所有页
- 第3个PDF:转换所有页(-1表示重复上一个规则)
python pdf2img.py \
--input ./contracts \
--output ./processed \
--folder-prefix "contract_" \
--image-suffix "_scan" \
--format png输出示例:
- 文件夹:
contract_agreement/ - 图片:
agreement_scan_1.png,agreement_scan_2.png, ...
output/
├── document1/
│ ├── document1_1.png
│ ├── document1_2.png
│ └── document1_3.png
└── document2/
├── document2_1.png
└── document2_2.png
output/
├── document1.zip
│ ├── document1_1.png
│ ├── document1_2.png
│ └── document1_3.png
└── document2.zip
├── document2_1.png
└── document2_2.png
错误信息:
PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?
解决方法:
- 确保已安装Poppler(见"安装Poppler"部分)
- 用户需要将Poppler添加到PATH:
export PATH="/usr/local/bin:$PATH"
处理大型PDF或高DPI时可能出现内存问题。
解决方法:
- 降低DPI值(如从300降到200)
- 使用页数范围规则,分批处理
- 处理单个文件而不是整个文件夹
解决方法:
- 提高DPI值(建议:屏幕显示150-200,打印300-600)
- 对于JPG格式,提高quality参数
- 改用PNG格式(无损压缩)
-
DPI设置:DPI越高,质量越好但文件越大、转换越慢
- 屏幕浏览:150-200 DPI
- 一般打印:200-300 DPI
- 高质量打印:300-600 DPI
-
格式选择:
- PNG:无损压缩,文件较大,适合文字和图表
- JPG:有损压缩,文件较小,适合照片和复杂图像
-
批量处理:文件夹模式会自动递归查找所有PDF文件