你有没有遇到过这种情况?
一份50页的PDF合同要发到微信群里,但微信不能直接预览PDF文件,对方只能看到"文件"两个字,点开还要下载。你想把内容发出来让大家直接看,只能一页页截图。
你打开PDF,翻到第1页,截图,保存,命名"合同_第1页"……翻到第2页,截图,保存,命名"合同_第2页"……手指点了50次,眼睛都快花了,才弄了一半。另一半?明天再说吧。
或者你是老师,想把PDF课件转成图片插入PPT。手动一页页截图,不仅慢,截出来的图还不清晰——放到PPT里全是糊的,学生根本看不清。
又或者你做汇报,想把PDF资料转成图片放在演示文稿里。打开在线转换工具,要么有水印,要么限制页数,要么收费。免费版只能转3页,剩下的要开会员,一个月99。
烦不烦?
我写了30行代码,做了一个事:批量将PDF的每一页转换成高清图片,一键搞定,免费无限制,无水印。
原来:打开PDF → 截图 → 保存 → 命名 → 下一页 → 重复50遍 → 半夜了现在:运行脚本 → 输入文件夹路径 → 5秒钟搞定
效果展示
输入: 一个文件夹,里面有4个PDF文件
输出: 一个「图片」文件夹,里面是16张高清JPG图片
每个PDF的每一页都变成了高清图片,自动按顺序命名,清晰度可调,想用在哪里用在哪里。
完整代码
import osimport fitz # PyMuPDFdef pdf_to_images(pdf_path, output_folder, image_format='jpeg', dpi=200):"""使用PyMuPDF将PDF的每一页转换为图片"""doc = Nonetry:# 打开PDFdoc = 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 DPImat = 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_countexcept Exception as e:print(f" ❌ 失败: {str(e)[:60]}")return 0finally:# 确保文档被正确关闭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文件")returnprint(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 = 0success_count = 0for 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 += 1total_pages += pagesprint(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 200batch_pdf_to_images(path, image_format=image_format, dpi=dpi)input("\n按回车键退出...")
使用步骤
打开终端(Windows用CMD或PowerShell,Mac/Linux用Terminal)
安装依赖:
pip install PyMuPDF把上面的完整代码复制到一个文本文件里,保存为
pdf_to_images.py把所有要转换的PDF文件放在同一个文件夹里,比如
C:/我的PDF在终端中运行:
python pdf_to_images.py根据提示输入文件夹路径,比如
C:/我的PDF选择图片格式(直接回车用默认的JPEG)
选择DPI(直接回车用默认的200)
等待几秒钟,打开同目录下的「图片」文件夹,就能看到所有转换好的图片了
踩坑记录
坑1: 第一次用的 pdf2image 库需要安装 poppler,Windows用户配置起来很麻烦。换成了 PyMuPDF 后,一条命令搞定,什么都不用装。
坑2: 转换出来的图片模糊。加了DPI参数后,想要多清晰就有多清晰。默认200已经够用,想要印刷级就调300。
坑3:document closed 报错。原因是文档关闭顺序不对,先关闭了文档再去获取页数。修复后先获取页数再关闭文档,问题解决。
坑4: 文件名乱码。PyMuPDF原生支持中文,文件名、路径、内容都能正确处理。
还能怎么玩
批量PDF转PNG:选PNG格式,适合需要透明背景的场景
调整清晰度:DPI调300,输出印刷级高清图片
批量处理多个文件夹:写个循环,一次处理多个文件夹
转成图片后自动压缩:配合之前的「批量压缩图片」工具,进一步减小文件大小
夜雨聆风