Python办公自动化:利用Python批量将PDF转换为图片文件

**前言:**在日常办公中,我们经常遇到这样的场景:产品说明书是PDF格式,需要提取里面的图片做成素材库;论文、简历需要转成图片格式以便预览或上传。手动一个个打开PDF、截图、保存?几十个文件下来,手都点麻了😭

这时候,Python办公自动化就能发挥巨大作用。今天我就带大家用 PyMuPDF(也就是 fitz 库)写一个批量转换脚本,一键将文件夹内所有PDF转为高清PNG图片。而且,我会把我在实际踩坑中遇到的新旧版本API不兼容问题全部列出来供大家参考

目录

一、安装依赖库

[1.1 完整代码和实现原理](#1.1 完整代码和实现原理)

1.2路径获取

[二、 代码逐段精讲](#二、 代码逐段精讲)

[2.1 动态获取路径,不写死盘符](#2.1 动态获取路径,不写死盘符)

[2. 2 控制图片清晰度(DPI)](#2. 2 控制图片清晰度(DPI))

[2.3 自动创建分类文件夹](#2.3 自动创建分类文件夹)

[三、⚠️ 重点:避坑指南](#三、⚠️ 重点:避坑指南)

[四、 总结](#四、 总结)


一、安装依赖库

只需要安装一个库------PyMuPDF(它内部包含 fitz 模块):

bash 复制代码
pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple

1.1 完整代码和实现原理

创建一个Python文件(比如 pdf_to_image.py),将以下代码完整复制进去:

python 复制代码
# -*- coding: utf-8 -*-

'''
Python批量将PDF转为图片文件
'''

# 安装所需模块(建议安装最新版)
# pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple


import os
import fitz


def pyMuPDF_fitz(pdfPath, imagePath):
    '''转换主函数'''
    pdfDoc = fitz.open(pdfPath)
    for pg in range(len(pdfDoc)):  # 兼容新旧版
        page = pdfDoc[pg]
        rotate = int(0)
        zoom_x = 1.33333333
        zoom_y = 1.33333333
        # 新版方法名为 prerotate(小写)
        mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
        # 新版方法名为 get_pixmap(下划线)
        pix = page.get_pixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):
            os.makedirs(imagePath)

        # 生成图片路径
        img_path = os.path.join(imagePath, 'images_%s.png' % pg)

        # ---------- 兼容 writePNG 和 save ----------
        if hasattr(pix, 'writePNG'):  # 旧版
            pix.writePNG(img_path)
        else:  # 新版
            pix.save(img_path)  # save 自动根据扩展名保存为 PNG

    print('转换成功: ' + imagePath)


if __name__ == '__main__':
    # 动态获取脚本所在目录
    base_dir = os.path.dirname(os.path.abspath(__file__))
    pdfpath = base_dir
    imgpath = base_dir

    files = os.listdir(pdfpath)
    pptfiles = [f for f in files if f.lower().endswith(".pdf")]

    for pptfile in pptfiles:
        pdffilepath = os.path.join(pdfpath, pptfile)
        # 为每个 PDF 建立独立子文件夹
        minimgpath = os.path.join(imgpath, os.path.splitext(pptfile)[0])
        try:
            pyMuPDF_fitz(pdffilepath, minimgpath)
        except Exception as e:
            print(f"处理文件 {pptfile} 时出错:{e}")

1.2路径获取

需要注意的是PDF的存放路径必须是在你文件代码的同一路径下。

1.3使用动态路径(推荐)

不必写死绝对路径,让脚本自动定位到当前文件所在目录,然后拼接子目录或直接使用当前目录。

复制代码
import os
import sys

# 获取当前脚本所在目录
script_dir = os.path.dirname(os.path.abspath(__file__))

# 如果你把PDF放在脚本所在的同一个文件夹
pdfpath = script_dir
imgpath = script_dir  # 或新建子目录,如 os.path.join(script_dir, 'output')

二、 代码逐段精讲

2.1 动态获取路径,不写死盘符

python 复制代码
base_dir = os.path.dirname(os.path.abspath(__file__))

这行代码会自动获取当前脚本所在的文件夹路径。好处是:你把脚本和PDF放在任意目录,它都能自动识别,完全不需要手动修改代码里的路径。

2. 2 控制图片清晰度(DPI)

python 复制代码
zoom_x = 1.33333333
zoom_y = 1.33333333

这个缩放系数决定了输出图片的分辨率。1.333 倍大约相当于 144 DPI (默认是 96 DPI),既清晰又不会文件太大。如果你需要超高清(比如印刷用),可以改成 23

2.3 自动创建分类文件夹

复制代码
minimgpath = os.path.join(imgpath, os.path.splitext(pdf_file)[0])
  • os.path.splitext(pdf_file)[0] 去掉 .pdf 后缀,得到文件名。

  • 每个PDF的图片会保存在 以PDF文件名命名的子文件夹 里,防止图片混在一起。


三、⚠️ 重点:避坑指南

我在写这个脚本时,遇到了好几个报错,都是 PyMuPDF 新旧版本 API 不兼容导致的。下面我把这些坑全部列出来,帮你节省大量时间:

报错信息 产生原因 解决方案
'Matrix' object has no attribute 'preRotate' 旧版方法名是驼峰 preRotate,新版改为全小写 prerotate 改为 .prerotate(rotate)
'Page' object has no attribute 'getPixmap' 旧版方法名 getPixmap,新版改为下划线 get_pixmap 改为 .get_pixmap()
'Pixmap' object has no attribute 'writePNG' 旧版用 writePNG() 保存图片,新版统一为 save() hasattr 判断,优先用 writePNG,否则用 save

特别是第三个坑 ,我在代码中做了全版本兼容处理:

python 复制代码
if hasattr(pix, 'writePNG'):
    pix.writePNG(img_path)
else:
    pix.save(img_path)

这样一来,不管读者用的是老项目还是新环境,复制代码就能跑,完全不用担心版本报错

四、 总结

通过不到50行Python代码,我们实现了一个全自动、全版本兼容的PDF批量转图片工具。它:

  • ✅ 自动识别当前目录所有PDF

  • ✅ 高清输出(可自定义DPI)

  • ✅ 按PDF文件名自动分类保存

  • ✅ 兼容PyMuPDF所有版本(无需操心报错)

办公自动化的魅力就在于此------把重复、枯燥的工作交给代码,把时间留给更有价值的事情

希望这篇文章对你有帮助!如果你在运行过程中遇到任何问题,欢迎在评论区留言,我会尽力协助。

如果觉得有用,点个赞和收藏再走吧~ 🙏

相关推荐
阿童木写作1 小时前
Python实现Temu图片批量翻译自动化教程
运维·人工智能·python·自动化
就是一只白3 小时前
复制地理信息python版本
python
看浪的路人3 小时前
第1讲:Agent 到底是什么?和 Chatbot 有什么区别
python·ai
瓦学妹3 小时前
什么是网络索引?它是如何工作的?
大数据·网络·python·网络爬虫
天天爱吃肉82184 小时前
商用车多体动力学实战笔记|第6篇:动力传动系统(发动机、变速箱、分动器、TCS、LSD限滑差速)
大数据·人工智能·笔记·python·嵌入式硬件·汽车
海盗12344 小时前
微软技术周报 ——2026-08-03
后端·python·microsoft·c#·.netcore
大数据魔法师4 小时前
【最全详解】DuckDB Python 全套 API 语法、参数与实战用法(零基础全覆盖)
python·数据分析
MC皮蛋侠客5 小时前
SQLAlchemy 系列(七):高级建模与高效写入——批量 DML、方言与扩展
数据库·python
Zane19946 小时前
@property 到底是怎么把方法伪装成属性的?一文吃透 property、staticmethod、classmethod
后端·python
qq_316411036 小时前
AI 情感陪伴智能潮玩软硬件一体化开发案例
人工智能·python