乐于分享
好东西不私藏

Python 实战项目合集|PDF 批量处理神器(合并 / 拆分 / 提取 / 转换,新手 1 小时搞定)

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文件!")        return    pdf_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 = 0    file_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_page        file_count += 1    print(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文件!")        return    with pdfplumber.open(pdf_file) as pdf:        total_pages = len(pdf.pages)        end_page = end_page if end_page else total_pages        end_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_pages        end_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 += 1    print(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_pages    end_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 + i        img_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. 合并PDF        if 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文件!")                continue            print("📋 目录下的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. 拆分PDF        elif choice == "2":            print("\n===== PDF拆分 =====")            pdf_file = input("请输入要拆分的PDF文件路径(如:test.pdf):")            if not os.path.exists(pdf_file):                print("❌ 文件不存在!")                continue            split_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 = None            split_pdf(pdf_file, split_pages)        # 3. 提取文字        elif choice == "3":            print("\n===== 提取PDF文字 =====")            pdf_file = input("请输入要提取文字的PDF文件路径:")            if not os.path.exists(pdf_file):                print("❌ 文件不存在!")                continue            start_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("❌ 文件不存在!")                continue            start_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("❌ 文件不存在!")                continue            start_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 实战应用的理解。

如果觉得这个工具有用,欢迎点赞 + 在看 + 转发,让更多职场人告别重复劳动!


总结

  1. 本次 PDF 批量处理工具基于PyPDF2(合并 / 拆分)、pdfplumber(提取文字 / 图片)、pdf2image(转图片)实现,覆盖 5 大核心 PDF 处理场景;
  2. 程序内置菜单交互和数据校验,新手无需改代码,按提示输入即可使用,所有处理结果自动保存在指定文件夹;
  3. PDF 转图片功能需额外安装 poppler,大文件建议分批次处理,避免内存不足,可基于基础版本扩展加密、转 Word 等功能。