Python利用pdfplumber+PyPDF2实现PDF文件自动化处理

 更新时间:2026年06月29日 08:38:51   作者:张老师技术栈  
这段文章详细介绍了使用Python处理PDF文件的方法,涵盖了从安装库、读取PDF文字到提取表格、合并拆分PDF、加密码以及处理扫描件PDF的全过程,通过使用pdfplumber和PyPDF2库,可以实现自动化处理PDF文件,提高工作效率,需要的朋友可以参考下

PDF 是办公文件里最难处理的格式——看似简单的提取文字、合并拆分,用常规方法做起来都很麻烦。这篇讲几个最实用的 PDF 处理场景,代码直接复制就能用。

一、安装

pip install pdfplumber PyPDF2  # 两个库各有侧重,搭配使用
擅长不擅长
pdfplumber提取文字、表格,精度高合并拆分 PDF
PyPDF2合并、拆分、旋转、加密 PDF提取表格不太行

两个都装上,各取所长。

二、读取 PDF 文字

1. 提取所有文字

import pdfplumber

with pdfplumber.open("报告.pdf") as pdf:
    # 总页数
    print(f"共 {len(pdf.pages)} 页")

    full_text = ""
    for i, page in enumerate(pdf.pages):
        text = page.extract_text()
        if text:
            full_text += text + "\n"
            print(f"第 {i+1} 页: {len(text)} 字符")

# 保存成 txt
with open("输出.txt", "w", encoding="utf-8") as f:
    f.write(full_text)

2. 提取指定页面

import pdfplumber

with pdfplumber.open("报告.pdf") as pdf:
    # 提取第 3-5 页(页码从 0 开始)
    for i in range(2, 5):
        page = pdf.pages[i]
        text = page.extract_text()
        print(f"=== 第 {i+1} 页 ===")
        print(text)

3. 解决中文乱码问题

PDF 中文提取乱码很常见,试试这些方法:

import pdfplumber

with pdfplumber.open("报告.pdf") as pdf:
    for page in pdf.pages:
        # 方法1:直接提取
        text = page.extract_text()

        # 方法2:如果乱码,试试保留空白
        text = page.extract_text(x_tolerance=3, y_tolerance=3)

        # 方法3:按行提取
        lines = page.extract_text_lines()
        for line in lines:
            print(line["text"])

如果还是乱码,那说明 PDF 本身是扫描件(图片型 PDF),需要 OCR 识别,后面会讲。

三、提取 PDF 中的表格

pdfplumber 提取表格精度很高,比手动复制粘贴快 100 倍:

import pdfplumber
import pandas as pd

with pdfplumber.open("财务报表.pdf") as pdf:
    all_tables = []

    for page in pdf.pages:
        tables = page.extract_tables()
        for table in tables:
            # table 是二维列表,第一行通常是表头
            df = pd.DataFrame(table[1:], columns=table[0])
            all_tables.append(df)
            print(f"找到 1 个表格,{len(table)} 行 × {len(table[0])} 列")

# 合并所有表格并导出
if all_tables:
    result = pd.concat(all_tables, ignore_index=True)
    result.to_excel("表格数据.xlsx", index=False)
    print(f"共提取 {len(result)} 行数据,已导出到 表格数据.xlsx")

实际案例: 提取每个月的财务报表 PDF → 自动汇总到 Excel → 每月省 30 分钟的重复劳动。

四、合并多个 PDF

from PyPDF2 import PdfMerger
import os

def merge_pdfs(input_dir, output_file):
    """合并一个文件夹下的所有 PDF"""
    merger = PdfMerger()

    # 按文件名排序,保证顺序
    files = sorted([f for f in os.listdir(input_dir) if f.endswith(".pdf")])

    for f in files:
        filepath = os.path.join(input_dir, f)
        merger.append(filepath)
        print(f"已添加: {f}")

    merger.write(output_file)
    merger.close()
    print(f"合并完成,共 {len(files)} 个文件 → {output_file}")

# 使用
merge_pdfs("要合并的PDF", "合并结果.pdf")

五、拆分 PDF

from PyPDF2 import PdfReader, PdfWriter

def split_pdf(input_file, output_dir, pages_per_file=10):
    """按每N页一组拆分 PDF"""
    reader = PdfReader(input_file)
    total_pages = len(reader.pages)

    os.makedirs(output_dir, exist_ok=True)

    file_index = 1
    for start in range(0, total_pages, pages_per_file):
        writer = PdfWriter()
        end = min(start + pages_per_file, total_pages)

        for page_num in range(start, end):
            writer.add_page(reader.pages[page_num])

        output_file = f"{output_dir}/第{file_index}部分({start+1}-{end}页).pdf"
        with open(output_file, "wb") as f:
            writer.write(f)

        print(f"已生成: {output_file}")
        file_index += 1

# 使用:每 20 页拆一份
split_pdf("大文件.pdf", "拆分输出", pages_per_file=20)

六、给 PDF 加密码

from PyPDF2 import PdfReader, PdfWriter

def encrypt_pdf(input_file, password, output_file=None):
    """给 PDF 加上密码保护"""
    reader = PdfReader(input_file)
    writer = PdfWriter()

    for page in reader.pages:
        writer.add_page(page)

    writer.encrypt(password)

    output = output_file or input_file.replace(".pdf", "_加密.pdf")
    with open(output, "wb") as f:
        writer.write(f)

    print(f"已加密: {output}")
    return output

# 使用
encrypt_pdf("合同.pdf", "123456", "合同_加密.pdf")

七、处理扫描件 PDF(OCR 识别)

如果 PDF 是扫描图片,pdfplumber 提取不到文字,需要用 OCR:

pip install pytesseract pillow
# 还需要安装 Tesseract-OCR 引擎(百度搜索下载)
import pytesseract
from PIL import Image
import pdfplumber
import io

def ocr_pdf(pdf_path):
    """OCR 识别扫描件 PDF"""
    with pdfplumber.open(pdf_path) as pdf:
        full_text = ""
        for i, page in enumerate(pdf.pages):
            # 把 PDF 页面转成图片
            img = page.to_image(resolution=300)
            img_path = f"temp_page_{i}.png"
            img.save(img_path)

            # OCR 识别
            text = pytesseract.image_to_string(
                Image.open(img_path), lang="chi_sim+eng"
            )
            full_text += text + "\n"
            print(f"第 {i+1} 页识别完成,{len(text)} 字符")

    with open("ocr_result.txt", "w", encoding="utf-8") as f:
        f.write(full_text)
    return full_text

# 使用(识别中文要下载中文语言包)
ocr_pdf("扫描件.pdf")

注意: OCR 识别需要安装 Tesseract-OCR 引擎,Windows 用户下载安装包后要配置环境变量。中文识别还需要下载 chi_sim 语言包。

八、常用场景速查表

场景代码用哪个库
提取文字page.extract_text()pdfplumber
提取表格page.extract_tables()pdfplumber
合并多个 PDFmerger.append(file)PyPDF2
拆分 PDFwriter.add_page(page)PyPDF2
加密码writer.encrypt(password)PyPDF2
提取图片page.to_image()pdfplumber
OCR 识别image_to_string()pytesseract
旋转页面page.rotate(90)PyPDF2

九、完整案例:发票信息批量提取

import pdfplumber
import pandas as pd
import os

def extract_invoice_info(pdf_path):
    """从发票 PDF 中提取关键信息"""
    info = {"文件名": os.path.basename(pdf_path)}

    with pdfplumber.open(pdf_path) as pdf:
        text = ""
        for page in pdf.pages:
            text += page.extract_text() or ""

    # 用正则提取关键信息(根据实际发票格式调整)
    import re

    # 发票号码
    match = re.search(r"发票号码[::]\s*(\d+)", text)
    info["发票号码"] = match.group(1) if match else ""

    # 开票日期
    match = re.search(r"开票日期[::]\s*(\d{4}[-年]\d{1,2}[-月]\d{1,2})", text)
    info["开票日期"] = match.group(1) if match else ""

    # 金额
    match = re.search(r"价税合计[::]\s*[¥¥]?([\d,]+\.\d{2})", text)
    info["金额"] = match.group(1) if match else ""

    # 销售方名称
    match = re.search(r"销售方[名称]?[::]\s*(.+?)(?:\n|$)", text)
    info["销售方"] = match.group(1).strip() if match else ""

    return info

# 批量处理所有 PDF
pdf_dir = "发票文件夹"
results = []

for f in os.listdir(pdf_dir):
    if f.endswith(".pdf"):
        try:
            info = extract_invoice_info(os.path.join(pdf_dir, f))
            results.append(info)
            print(f"已处理: {f}")
        except Exception as e:
            print(f"处理失败 {f}: {e}")

# 导出到 Excel
df = pd.DataFrame(results)
df.to_excel("发票汇总.xlsx", index=False)
print(f"共处理 {len(results)} 份发票")

总结

PDF 自动化处理最难的不是技术,而是不同的 PDF 格式差异太大(有的是文字型、有的是扫描件、有的表格不规范)。一篇 80% 的 PDF 用上面的代码能搞定,剩下 20% 需要根据具体 PDF 格式微调参数。

建议遇到新的 PDF 格式时,先用 pdfplumber 打开看看结构,再决定怎么提取。

以上就是Python利用pdfplumber+PyPDF2实现PDF文件自动化处理的详细内容,更多关于Python PDF自动化处理的资料请关注脚本之家其它相关文章!

相关文章

  • Django组件之cookie与session的使用方法

    Django组件之cookie与session的使用方法

    这篇文章主要介绍了Django组件之cookie与session的使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • 使用Python实现对比两个PDF文档的差异

    使用Python实现对比两个PDF文档的差异

    在文档版本管理、合同审核、报告校对等场景中,准确识别两个 PDF 文件之间的差异是一项常见需求,本文介绍如何利用 Spire.PDF for Python 库,通过编程方式自动化完成 PDF 文档的差异对比工作,希望对大家有所帮助
    2026-04-04
  • Python使用kombu连接信息中包含#号问题排查方式

    Python使用kombu连接信息中包含#号问题排查方式

    文章描述了在部署Python项目到生产环境时遇到的一个错误,即端口号无法正确转换为整数值,该错误在测试环境和本地调试中没有出现,但在生产环境中才出现,通过分析错误信息和代码,作者发现问题出在URL解析过程中,特别是在处理包含特殊字符(如#号)的URL时
    2024-12-12
  • Python Pickling 和 Unpickling 的区别

    Python Pickling 和 Unpickling 的区别

    Python中的Pickling和Unpickling是与数据序列化和反序列化相关的重要概念,本文主要介绍了Python Pickling和Unpickling的区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Python实现的计算器功能示例

    Python实现的计算器功能示例

    这篇文章主要介绍了Python实现的计算器功能,涉及Python四则运算、取反、百分比等相关数学运算操作实现技巧,需要的朋友可以参考下
    2018-04-04
  • 解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题

    解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题

    这篇文章主要介绍了解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 基于OpenCV实现动态画矩形和多边形并保存坐标

    基于OpenCV实现动态画矩形和多边形并保存坐标

    这篇文章主要为大家详细介绍了如何利用OpenCV实现动态画矩形和多边形并保存坐标,文中的示例代码讲解详细,具有一定的参考价值,需要的可以参考一下
    2023-03-03
  • 详解python中requirements.txt的一切

    详解python中requirements.txt的一切

    最近学习到了python中的requirements.txt,或许是因为太简单了,网上没有搜到比较完整的介绍,所以这篇文章主要介绍了关于python中requirements.txt的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-03-03
  • Python设计模式优雅构建代码全面教程示例

    Python设计模式优雅构建代码全面教程示例

    Python作为一门多范式的编程语言,提供了丰富的设计模式应用场景,在本文中,我们将详细介绍 Python 中的各种设计模式,包括创建型、结构型和行为型模式
    2023-11-11
  • PyTorch device与cuda.device用法介绍

    PyTorch device与cuda.device用法介绍

    这篇文章主要介绍了PyTorch device与cuda.device用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04

最新评论