Python 实战项目合集|PDF 批量处理神器(合并 / 拆分 / 提取 / 转换,新手 1 小时搞定)
大家好!
今天给大家带来办公场景中超高频、超刚需的 Python 实战项目 ——「PDF 批量处理工具」。
日常工作中,我们总会遇到这些 PDF 处理难题:
🚫 几十份 PDF 要手动合并成一个文件
🚫 大 PDF 要拆分成多个小文件
🚫 想提取 PDF 里的文字 / 图片 / 表格
🚫 需要把 PDF 转成 Word/Excel/ 图片
今天这个工具,一行代码都不用改,复制就能用,新手也能 1 小时搞定,彻底告别付费 PDF 工具!
一、这个 PDF 工具能解决什么问题?
✅ 批量合并多个 PDF 文件(支持自定义顺序)
✅ 按页数拆分 PDF(拆成单个 / 多个文件)
✅ 提取 PDF 中的文字(整页 / 指定页)
✅ 提取 PDF 中的图片(自动保存到文件夹)
✅ PDF 转图片(整册 / 指定页转换)
✅ 纯 Python 实现,无需安装 Adobe / 付费软件
二、准备工作(3 分钟搞定)
打开命令提示符,安装所需依赖(复制粘贴即可):
# 核心PDF处理库pip install PyPDF2# 提取PDF文字/图片pip install pdfplumber# PDF转图片(需先装poppler,看文末备注)pip install pdf2image
💡 备注:安装 pdf2image 前,需先安装 poppler:
-
Windows:下载 poppler 包,解压后配置环境变量 -
Mac:brew install poppler -
Linux:sudo apt-get install poppler-utils(如果仅用合并 / 拆分 / 提取文字功能,可跳过 pdf2image 安装)
三、完整代码(直接复制即用)
import osimport PyPDF2import pdfplumberfrom pdf2image import convert_from_pathfrom datetime import datetime# ===================== 基础配置 =====================# 生成文件的保存路径(默认当前目录)SAVE_PATH = "./PDF处理结果"# 创建保存目录if not os.path.exists(SAVE_PATH):os.makedirs(SAVE_PATH)# ===================== PDF合并 =====================def merge_pdfs(pdf_files, output_name="合并后的PDF.pdf"):"""合并多个PDF文件:param pdf_files: PDF文件列表(按合并顺序):param output_name: 输出文件名"""if not pdf_files:print("❌ 没有选择要合并的PDF文件!")returnpdf_merger = PyPDF2.PdfMerger()# 逐个添加PDF文件for pdf_file in pdf_files:if pdf_file.endswith(".pdf") and os.path.exists(pdf_file):pdf_merger.append(pdf_file)print(f"✅ 已添加:{pdf_file}")else:print(f"❌ 文件无效,跳过:{pdf_file}")# 保存合并后的文件output_path = os.path.join(SAVE_PATH, output_name)pdf_merger.write(output_path)pdf_merger.close()print(f"\n🎉 PDF合并完成!文件保存至:{output_path}")# ===================== PDF拆分 =====================def split_pdf(pdf_file, split_pages=None):"""拆分PDF文件:param pdf_file: 要拆分的PDF文件:param split_pages: 拆分页数列表(如[5, 10]表示拆成1-5、6-10、11+页)"""if not os.path.exists(pdf_file) or not pdf_file.endswith(".pdf"):print("❌ 请选择有效的PDF文件!")return# 获取PDF总页数with open(pdf_file, "rb") as f:pdf_reader = PyPDF2.PdfReader(f)total_pages = len(pdf_reader.pages)if split_pages is None:# 默认按单页拆分split_pages = list(range(1, total_pages+1))# 补充最后一页if split_pages[-1] < total_pages:split_pages.append(total_pages)start_page = 0file_count = 1# 开始拆分for end_page in split_pages:end_page = min(end_page, total_pages)pdf_writer = PyPDF2.PdfWriter()# 添加指定页数的内容for page_num in range(start_page, end_page):pdf_writer.add_page(pdf_reader.pages[page_num])# 保存拆分后的文件output_name = f"{os.path.splitext(os.path.basename(pdf_file))[0]}_拆分{file_count}.pdf"output_path = os.path.join(SAVE_PATH, output_name)with open(output_path, "wb") as f:pdf_writer.write(f)print(f"✅ 拆分文件{file_count}:{start_page+1}-{end_page}页,保存至:{output_name}")start_page = end_pagefile_count += 1print(f"\n🎉 PDF拆分完成!共生成{file_count-1}个文件,保存至:{SAVE_PATH}")# ===================== 提取PDF文字 =====================def extract_pdf_text(pdf_file, start_page=1, end_page=None):"""提取PDF中的文字:param pdf_file: 要提取的PDF文件:param start_page: 起始页(默认第1页):param end_page: 结束页(默认全部)"""if not os.path.exists(pdf_file) or not pdf_file.endswith(".pdf"):print("❌ 请选择有效的PDF文件!")returnwith pdfplumber.open(pdf_file) as pdf:total_pages = len(pdf.pages)end_page = end_page if end_page else total_pagesend_page = min(end_page, total_pages)# 提取文字text_content = ""for page_num in range(start_page-1, end_page):page = pdf.pages[page_num]text = page.extract_text()if text:text_content += f"\n===== 第{page_num+1}页 =====\n{text}"# 保存文字内容output_name = f"{os.path.splitext(os.path.basename(pdf_file))[0]}_提取文字.txt"output_path = os.path.join(SAVE_PATH, output_name)with open(output_path, "w", encoding="utf-8") as f:f.write(text_content)print(f"✅ 文字提取完成!共提取{start_page}-{end_page}页,保存至:{output_path}")# ===================== 提取PDF图片 =====================def extract_pdf_images(pdf_file, start_page=1, end_page=None):"""提取PDF中的图片:param pdf_file: 要提取的PDF文件:param start_page: 起始页(默认第1页):param end_page: 结束页(默认全部)"""if not os.path.exists(pdf_file) or not pdf_file.endswith(".pdf"):print("❌ 请选择有效的PDF文件!")return# 创建图片保存子目录img_save_path = os.path.join(SAVE_PATH, f"{os.path.splitext(os.path.basename(pdf_file))[0]}_提取图片")if not os.path.exists(img_save_path):os.makedirs(img_save_path)with pdfplumber.open(pdf_file) as pdf:total_pages = len(pdf.pages)end_page = end_page if end_page else total_pagesend_page = min(end_page, total_pages)img_count = 1# 提取图片for page_num in range(start_page-1, end_page):page = pdf.pages[page_num]for img in page.images:# 保存图片img_data = img["stream"].get_data()img_ext = img["ext"] if "ext" in img else "png"img_name = f"第{page_num+1}页_图片{img_count}.{img_ext}"img_path = os.path.join(img_save_path, img_name)with open(img_path, "wb") as f:f.write(img_data)print(f"✅ 提取图片:{img_name}")img_count += 1print(f"\n🎉 图片提取完成!共提取{img_count-1}张图片,保存至:{img_save_path}")# ===================== PDF转图片 =====================def pdf_to_images(pdf_file, start_page=1, end_page=None, img_format="png"):"""PDF转换为图片:param pdf_file: 要转换的PDF文件:param start_page: 起始页(默认第1页):param end_page: 结束页(默认全部):param img_format: 图片格式(png/jpg)"""if not os.path.exists(pdf_file) or not pdf_file.endswith(".pdf"):print("❌ 请选择有效的PDF文件!")return# 创建图片保存子目录img_save_path = os.path.join(SAVE_PATH, f"{os.path.splitext(os.path.basename(pdf_file))[0]}_转图片")if not os.path.exists(img_save_path):os.makedirs(img_save_path)# 获取PDF总页数with open(pdf_file, "rb") as f:pdf_reader = PyPDF2.PdfReader(f)total_pages = len(pdf_reader.pages)end_page = end_page if end_page else total_pagesend_page = min(end_page, total_pages)# 转换图片pages = convert_from_path(pdf_file,first_page=start_page,last_page=end_page,fmt=img_format)# 保存图片for i, page in enumerate(pages):page_num = start_page + iimg_name = f"第{page_num}页.{img_format}"img_path = os.path.join(img_save_path, img_name)page.save(img_path, img_format.upper())print(f"✅ 转换图片:{img_name}")print(f"\n🎉 PDF转图片完成!共转换{len(pages)}页,保存至:{img_save_path}")# ===================== 主菜单 =====================def main():"""主程序菜单"""print("="*60)print("📄 Python PDF批量处理工具 📄")print("="*60)while True:print("\n请选择要执行的操作:")print("1. 合并多个PDF文件")print("2. 拆分PDF文件")print("3. 提取PDF中的文字")print("4. 提取PDF中的图片")print("5. PDF转换为图片")print("6. 退出程序")choice = input("\n输入操作编号(1-6):")# 1. 合并PDFif choice == "1":print("\n===== PDF合并 =====")pdf_dir = input("请输入PDF文件所在目录(默认当前目录,直接回车):") or "./"pdf_files = [f for f in os.listdir(pdf_dir) if f.endswith(".pdf")]if not pdf_files:print("❌ 该目录下没有PDF文件!")continueprint("📋 目录下的PDF文件:")for i, f in enumerate(pdf_files):print(f"{i+1}. {f}")# 选择要合并的文件(默认全部)select = input("请选择要合并的文件序号(如1,2,3,默认全部):")if select:selected_index = [int(i)-1 for i in select.split(",") if i.isdigit()]selected_files = [os.path.join(pdf_dir, pdf_files[i]) for i in selected_index if 0<=i<len(pdf_files)]else:selected_files = [os.path.join(pdf_dir, f) for f in pdf_files]output_name = input("请输入合并后的文件名(默认:合并后的PDF.pdf):") or "合并后的PDF.pdf"merge_pdfs(selected_files, output_name)# 2. 拆分PDFelif choice == "2":print("\n===== PDF拆分 =====")pdf_file = input("请输入要拆分的PDF文件路径(如:test.pdf):")if not os.path.exists(pdf_file):print("❌ 文件不存在!")continuesplit_input = input("请输入拆分页数(如5,10表示拆成1-5、6-10、11+页,直接回车按单页拆分):")if split_input:split_pages = [int(p) for p in split_input.split(",") if p.isdigit()]split_pages.sort()else:split_pages = Nonesplit_pdf(pdf_file, split_pages)# 3. 提取文字elif choice == "3":print("\n===== 提取PDF文字 =====")pdf_file = input("请输入要提取文字的PDF文件路径:")if not os.path.exists(pdf_file):print("❌ 文件不存在!")continuestart_page = input("请输入起始页(默认1):") or "1"end_page = input("请输入结束页(默认全部):")extract_pdf_text(pdf_file,start_page=int(start_page) if start_page.isdigit() else 1,end_page=int(end_page) if end_page.isdigit() else None)# 4. 提取图片elif choice == "4":print("\n===== 提取PDF图片 =====")pdf_file = input("请输入要提取图片的PDF文件路径:")if not os.path.exists(pdf_file):print("❌ 文件不存在!")continuestart_page = input("请输入起始页(默认1):") or "1"end_page = input("请输入结束页(默认全部):")extract_pdf_images(pdf_file,start_page=int(start_page) if start_page.isdigit() else 1,end_page=int(end_page) if end_page.isdigit() else None)# 5. PDF转图片elif choice == "5":print("\n===== PDF转图片 =====")pdf_file = input("请输入要转换的PDF文件路径:")if not os.path.exists(pdf_file):print("❌ 文件不存在!")continuestart_page = input("请输入起始页(默认1):") or "1"end_page = input("请输入结束页(默认全部):")img_format = input("请输入图片格式(png/jpg,默认png):") or "png"pdf_to_images(pdf_file,start_page=int(start_page) if start_page.isdigit() else 1,end_page=int(end_page) if end_page.isdigit() else None,img_format=img_format)# 6. 退出elif choice == "6":print("\n👋 感谢使用,再见!")break# 输入错误else:print("❌ 输入错误,请输入1-6之间的数字!")if __name__ == "__main__":main()
四、使用教程(超详细,新手必看)
步骤 1:保存代码
把完整代码复制,保存为pdf_tool.py(建议放在专门处理 PDF 的文件夹)。
步骤 2:安装依赖
按「准备工作」中的命令,安装所有需要的库(重点:PDF 转图片需额外装 poppler)。
步骤 3:运行程序
双击pdf_tool.py,或在命令行输入:
python pdf_tool.py
步骤 4:功能使用说明
运行后会看到主菜单,按数字选择功能即可:
👉 功能 1:合并多个 PDF
-
输入 PDF 所在目录(直接回车用当前目录) -
程序会列出所有 PDF 文件 -
选择要合并的文件序号(如 1,3,5,回车默认全部) -
输入合并后的文件名(回车用默认名) -
合并后的文件会保存在「PDF 处理结果」文件夹
👉 功能 2:拆分 PDF
-
输入要拆分的 PDF 文件路径(如 report.pdf) -
输入拆分页数(如 5,10表示拆成 1-5、6-10、11 + 页,回车默认按单页拆分) -
拆分后的文件会保存在「PDF 处理结果」文件夹
👉 功能 3:提取 PDF 文字
-
输入 PDF 文件路径 -
输入起始页 / 结束页(回车默认全部) -
提取的文字会保存为 TXT 文件,放在「PDF 处理结果」文件夹
👉 功能 4:提取 PDF 图片
-
输入 PDF 文件路径 -
输入起始页 / 结束页(回车默认全部) -
提取的图片会按页码分类,保存在专属子文件夹
👉 功能 5:PDF 转图片
-
输入 PDF 文件路径 -
输入起始页 / 结束页、图片格式(png/jpg) -
转换后的图片会按页码命名,保存在专属子文件夹
五、核心功能解析(新手也能懂)
1. 合并 PDF
基于PyPDF2.PdfMerger()实现,支持自定义合并顺序,自动跳过无效文件。
2. 拆分 PDF
通过PyPDF2.PdfReader()读取页数,PdfWriter()写入指定页数内容,支持自定义拆分规则。
3. 提取文字 / 图片
用pdfplumber库(比 PyPDF2 更精准),能逐页提取文字,识别图片格式并单独保存。
4. PDF 转图片
借助pdf2image库,支持指定页码范围、自定义图片格式,适合需要将 PDF 转为图片分享的场景。
5. 数据安全
所有处理结果都保存在「PDF 处理结果」文件夹,原文件不会被修改,放心使用。
六、新手常见问题解答
Q1:运行报错「No module named ‘PyPDF2’」?
A:先执行pip install PyPDF2安装缺失的库。
Q2:PDF 转图片功能报错?
A:核心原因是没装 poppler,按「准备工作」中的备注,先安装 poppler 并配置环境变量。
Q3:提取的文字乱码?
A:PDF 本身编码问题,可尝试用其他 PDF 工具先转换编码,或换pdfplumber以外的库(如PyMuPDF)。
Q4:处理大 PDF 卡顿?
A:大文件建议分批次处理(指定起始页 / 结束页),避免内存不足。
七、扩展优化建议(进阶学习)
学会基础版本后,可尝试优化:
-
添加「PDF 加密 / 解密」功能 -
支持 PDF 转 Word/Excel(可结合 python-docx/openpyxl) -
批量处理整个文件夹的 PDF(自动遍历) -
添加「提取 PDF 表格」功能(用 pdfplumber.extract_table()) -
制作可视化界面(用 tkinter/PyQt)
结语
这个 PDF 批量处理工具,几乎覆盖了日常办公中所有高频的 PDF 处理场景,而且完全免费、可自定义。
它融合了 Python 文件操作、第三方库使用、数据处理等核心技能,学会它不仅能解决实际工作问题,更能加深对 Python 实战应用的理解。
如果觉得这个工具有用,欢迎点赞 + 在看 + 转发,让更多职场人告别重复劳动!
总结
-
本次 PDF 批量处理工具基于 PyPDF2(合并 / 拆分)、pdfplumber(提取文字 / 图片)、pdf2image(转图片)实现,覆盖 5 大核心 PDF 处理场景; -
程序内置菜单交互和数据校验,新手无需改代码,按提示输入即可使用,所有处理结果自动保存在指定文件夹; -
PDF 转图片功能需额外安装 poppler,大文件建议分批次处理,避免内存不足,可基于基础版本扩展加密、转 Word 等功能。
夜雨聆风