乐于分享
好东西不私藏

50页PDF秒变50张高清图,再也不用一页页截图了,30行代码一键搞定

50页PDF秒变50张高清图,再也不用一页页截图了,30行代码一键搞定

你有没有遇到过这种情况?

一份50页的PDF合同要发到微信群里,但微信不能直接预览PDF文件,对方只能看到"文件"两个字,点开还要下载。你想把内容发出来让大家直接看,只能一页页截图。

你打开PDF,翻到第1页,截图,保存,命名"合同_第1页"……翻到第2页,截图,保存,命名"合同_第2页"……手指点了50次,眼睛都快花了,才弄了一半。另一半?明天再说吧。

或者你是老师,想把PDF课件转成图片插入PPT。手动一页页截图,不仅慢,截出来的图还不清晰——放到PPT里全是糊的,学生根本看不清。

又或者你做汇报,想把PDF资料转成图片放在演示文稿里。打开在线转换工具,要么有水印,要么限制页数,要么收费。免费版只能转3页,剩下的要开会员,一个月99。

烦不烦?

我写了30行代码,做了一个事:批量将PDF的每一页转换成高清图片,一键搞定,免费无限制,无水印。

原来:打开PDF → 截图 → 保存 → 命名 → 下一页 → 重复50遍 → 半夜了现在:运行脚本 → 输入文件夹路径 → 5秒钟搞定

效果展示

输入: 一个文件夹,里面有4个PDF文件

原文件
页数
文案01.pdf
4页
文案02.pdf
4页
文案03.pdf
4页
文案04.pdf
4页

输出: 一个「图片」文件夹,里面是16张高清JPG图片

文件名
文案01_第1页.jpg
文案01_第2页.jpg
文案01_第3页.jpg
文案01_第4页.jpg
文案02_第1页.jpg
文案02_第2页.jpg
文案02_第3页.jpg
文案02_第4页.jpg
文案03_第1页.jpg
...

每个PDF的每一页都变成了高清图片,自动按顺序命名,清晰度可调,想用在哪里用在哪里。

完整代码

import osimport fitz  # PyMuPDFdef pdf_to_images(pdf_path, output_folder, image_format='jpeg', dpi=200):    """    使用PyMuPDF将PDF的每一页转换为图片    """    doc = None    try:        # 打开PDF        doc = fitz.open(pdf_path)        name = os.path.splitext(os.path.basename(pdf_path))[0]        ext = 'jpg' if image_format == 'jpeg' else 'png'        # 缩放矩阵,控制图片质量        # DPI越高图片越清晰,文件也越大        zoom = dpi / 72  # PDF默认72 DPI        mat = fitz.Matrix(zoom, zoom)        # 先获取页数,再处理        page_count = len(doc)        for i, page in enumerate(doc, 1):            # 渲染页面为图片            pix = page.get_pixmap(matrix=mat)            output_path = os.path.join(output_folder, f"{name}_第{i}页.{ext}")            pix.save(output_path)        return page_count    except Exception as e:        print(f"  ❌ 失败: {str(e)[:60]}")        return 0    finally:        # 确保文档被正确关闭        if doc:            doc.close()def batch_pdf_to_images(folder_path, output_folder="图片", image_format='jpeg', dpi=200):    """    批量将PDF转换为图片    """    # 查找所有PDF文件    pdf_files = [f for f in os.listdir(folder_path)                  if f.lower().endswith('.pdf')]    if not pdf_files:        print("❌ 未找到PDF文件")        return    print(f"📂 找到 {len(pdf_files)} 个PDF文件")    print(f"🖼️ 图片格式: {image_format.upper()}")    print(f"📐 DPI: {dpi}")    # 创建输出文件夹    output_path = os.path.join(folder_path, output_folder)    os.makedirs(output_path, exist_ok=True)    total_pages = 0    success_count = 0    for pdf_file in pdf_files:        input_file = os.path.join(folder_path, pdf_file)        print(f"  📄 {pdf_file}")        pages = pdf_to_images(input_file, output_path, image_format, dpi)        if pages > 0:            success_count += 1            total_pages += pages            print(f"    ✅ 已提取 {pages} 页")        else:            print(f"    ❌ 失败")    print(f"\n✅ 完成!成功转换 {success_count} 个PDF")    print(f"📄 共生成 {total_pages} 张图片")    print(f"📁 保存在: {output_path}")if __name__ == "__main__":    print("=" * 50)    print("📄 批量PDF转图片工具")    print("=" * 50)    print()    path = input("请输入PDF文件夹路径: ").strip()    if path.startswith('"'and path.endswith('"'):        path = path[1:-1]    path = path.replace('\\''/')    if not os.path.exists(path):        print("❌ 路径不存在")        input("按回车键退出...")        exit()    print("\n支持的格式: jpeg, png")    image_format = input("请选择图片格式(默认jpeg): ").strip().lower() or 'jpeg'    if image_format not in ['jpeg''png']:        image_format = 'jpeg'    dpi_input = input("请输入DPI(默认200,越大越清晰): ").strip()    dpi = int(dpi_input) if dpi_input.isdigit() else 200    batch_pdf_to_images(path, image_format=image_format, dpi=dpi)    input("\n按回车键退出...")

使用步骤

  1. 打开终端(Windows用CMD或PowerShell,Mac/Linux用Terminal)

  2. 安装依赖:pip install PyMuPDF

  3. 把上面的完整代码复制到一个文本文件里,保存为 pdf_to_images.py

  4. 把所有要转换的PDF文件放在同一个文件夹里,比如 C:/我的PDF

  5. 在终端中运行:python pdf_to_images.py

  6. 根据提示输入文件夹路径,比如 C:/我的PDF

  7. 选择图片格式(直接回车用默认的JPEG)

  8. 选择DPI(直接回车用默认的200)

  9. 等待几秒钟,打开同目录下的「图片」文件夹,就能看到所有转换好的图片了

踩坑记录

坑1: 第一次用的 pdf2image 库需要安装 poppler,Windows用户配置起来很麻烦。换成了 PyMuPDF 后,一条命令搞定,什么都不用装。

坑2: 转换出来的图片模糊。加了DPI参数后,想要多清晰就有多清晰。默认200已经够用,想要印刷级就调300。

坑3:document closed 报错。原因是文档关闭顺序不对,先关闭了文档再去获取页数。修复后先获取页数再关闭文档,问题解决。

坑4: 文件名乱码。PyMuPDF原生支持中文,文件名、路径、内容都能正确处理。

还能怎么玩

  • 批量PDF转PNG:选PNG格式,适合需要透明背景的场景

  • 调整清晰度:DPI调300,输出印刷级高清图片

  • 批量处理多个文件夹:写个循环,一次处理多个文件夹

  • 转成图片后自动压缩:配合之前的「批量压缩图片」工具,进一步减小文件大小