本文目录导读:

我来帮你实现PDF转图片的脚本,这里提供几种常用的方法:
使用PyMuPDF(推荐)
import fitz # PyMuPDF
import os
def pdf_to_images(pdf_path, output_folder, dpi=200):
"""
将PDF每一页转换为图片
Args:
pdf_path: PDF文件路径
output_folder: 输出图片文件夹
dpi: 图片分辨率(默认200)
"""
# 创建输出文件夹
os.makedirs(output_folder, exist_ok=True)
# 打开PDF文件
pdf_document = fitz.open(pdf_path)
for page_num in range(len(pdf_document)):
# 获取页面
page = pdf_document[page_num]
# 设置缩放矩阵(控制分辨率)
zoom = dpi / 72 # PDF默认72 DPI
mat = fitz.Matrix(zoom, zoom)
# 渲染为图片
pix = page.get_pixmap(matrix=mat)
# 保存图片
output_path = os.path.join(output_folder, f'page_{page_num + 1}.png')
pix.save(output_path)
print(f"已保存第 {page_num + 1} 页")
pdf_document.close()
print(f"转换完成!共转换 {len(pdf_document)} 页")
# 使用示例
if __name__ == "__main__":
pdf_to_images("example.pdf", "output_images", dpi=300)
使用pdf2image
from pdf2image import convert_from_path
import os
def pdf_to_images_pdf2image(pdf_path, output_folder, dpi=200):
"""
使用pdf2image转换PDF为图片
Args:
pdf_path: PDF文件路径
output_folder: 输出文件夹
dpi: 图片分辨率
"""
os.makedirs(output_folder, exist_ok=True)
# 转换PDF为图片
images = convert_from_path(pdf_path, dpi=dpi)
for i, image in enumerate(images):
output_path = os.path.join(output_folder, f'page_{i + 1}.jpg')
image.save(output_path, 'JPEG', quality=95)
print(f"已保存第 {i + 1} 页")
print(f"转换完成!共转换 {len(images)} 页")
# 使用示例
if __name__ == "__main__":
pdf_to_images_pdf2image("example.pdf", "output_images", dpi=300)
使用PyMuPDF + 批量处理版本
import fitz
import os
from pathlib import Path
import argparse
class PDFToImageConverter:
def __init__(self, pdf_path, output_dir=None, dpi=200, image_format='png'):
"""
初始化转换器
Args:
pdf_path: PDF文件路径
output_dir: 输出目录(默认为PDF所在目录)
dpi: 图片DPI
image_format: 图片格式(png/jpg)
"""
self.pdf_path = Path(pdf_path)
self.output_dir = Path(output_dir) if output_dir else self.pdf_path.parent / f"{self.pdf_path.stem}_images"
self.dpi = dpi
self.image_format = image_format.lower()
def convert(self, pages=None, quality=95):
"""
执行转换
Args:
pages: 指定要转换的页码列表(从1开始),None表示所有页
quality: JPEG质量(仅对jpg格式有效)
"""
# 创建输出目录
self.output_dir.mkdir(parents=True, exist_ok=True)
# 打开PDF
doc = fitz.open(self.pdf_path)
total_pages = len(doc)
# 确定要转换的页面
if pages is None:
pages = range(1, total_pages + 1)
print(f"开始转换: {self.pdf_path.name}")
print(f"总页数: {total_pages}")
print(f"输出目录: {self.output_dir}")
print("-" * 40)
converted_count = 0
for page_num in pages:
if page_num < 1 or page_num > total_pages:
print(f"警告: 第{page_num}页不存在,跳过")
continue
# 获取页面
page = doc[page_num - 1]
# 设置缩放
zoom = self.dpi / 72
mat = fitz.Matrix(zoom, zoom)
# 渲染
pix = page.get_pixmap(matrix=mat)
# 保存
filename = f"page_{page_num:03d}.{self.image_format}"
output_path = self.output_dir / filename
if self.image_format == 'jpg' or self.image_format == 'jpeg':
pix.save(str(output_path), "jpeg", jpg_quality=quality)
else:
pix.save(str(output_path))
print(f"✓ 第{page_num}页: {filename}")
converted_count += 1
doc.close()
print("-" * 40)
print(f"转换完成!成功转换 {converted_count}/{len(pages)} 页")
return converted_count
def convert_all(self, quality=95):
"""转换所有页面"""
return self.convert(pages=None, quality=quality)
# 命令行接口
def main():
parser = argparse.ArgumentParser(description='PDF转图片工具')
parser.add_argument('pdf_path', help='PDF文件路径')
parser.add_argument('-o', '--output', help='输出目录')
parser.add_argument('-d', '--dpi', type=int, default=200, help='图片DPI (默认: 200)')
parser.add_argument('-f', '--format', default='png', choices=['png', 'jpg'], help='图片格式 (默认: png)')
parser.add_argument('-p', '--pages', help='指定页码,如: 1,3,5-8')
parser.add_argument('-q', '--quality', type=int, default=95, help='JPEG质量 (1-100)')
args = parser.parse_args()
# 解析页码范围
pages = None
if args.pages:
pages = []
for part in args.pages.split(','):
if '-' in part:
start, end = map(int, part.split('-'))
pages.extend(range(start, end + 1))
else:
pages.append(int(part))
# 执行转换
converter = PDFToImageConverter(
pdf_path=args.pdf_path,
output_dir=args.output,
dpi=args.dpi,
image_format=args.format
)
converter.convert(pages=pages, quality=args.quality)
if __name__ == "__main__":
main()
安装依赖
根据选择的方法,安装对应的库:
# 方法一:PyMuPDF pip install PyMuPDF # 方法二:pdf2image(需要安装poppler) pip install pdf2image # Windows还需要安装poppler: https://github.com/oschwartz10612/poppler-windows/releases/
使用示例
# 使用命令行版本
python pdf_to_image.py input.pdf -o output -d 300 -f png
# 指定特定页面
python pdf_to_image.py input.pdf -p 1,3-5 -f jpg -q 90
# Python代码中使用
converter = PDFToImageConverter("document.pdf", dpi=300)
converter.convert_all()
注意事项
- 内存管理:对于大PDF文件,建议逐页处理而不是一次加载所有页面
- 性能优化:适当降低DPI可以提高处理速度
- 字体问题:如果PDF包含特殊字体,可能需要安装相应字体
- 中文支持:确保系统支持中文编码
你可以根据自己的需求选择合适的方法,推荐使用PyMuPDF(fitz),因为它性能好且不需要额外依赖。