怎样实现PDF转图片脚本

wen 实用脚本 23

本文目录导读:

怎样实现PDF转图片脚本

  1. 方法一:使用PyMuPDF(推荐)
  2. 方法二:使用pdf2image
  3. 方法三:使用PyMuPDF + 批量处理版本
  4. 安装依赖
  5. 使用示例
  6. 注意事项

我来帮你实现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()

注意事项

  1. 内存管理:对于大PDF文件,建议逐页处理而不是一次加载所有页面
  2. 性能优化:适当降低DPI可以提高处理速度
  3. 字体问题:如果PDF包含特殊字体,可能需要安装相应字体
  4. 中文支持:确保系统支持中文编码

你可以根据自己的需求选择合适的方法,推荐使用PyMuPDF(fitz),因为它性能好且不需要额外依赖。

抱歉,评论功能暂时关闭!