Python 自动化处理 PDF 文件

职场中,PDF (Portable Document Format) 的地位不可替代——它的“跨平台所见即所得特性,能完美规避了Word/PPT在不同设备上排版崩坏的噩梦。在 Daoman Python AI 的日常自动化办公流程里,无论是批量整理扫描件、生成数据报告、还是批量给合同加密,Python 都是处理 PDF 的「瑞士军刀」。

本文整理了5个高频且实用的场景,配的都是能直接改改运行的代码👇


1. 从 PDF 中提取文本

如果只是想快速把标准文本型PDF的文字扒下来,PyPDF2 是首选:轻量、稳定,上手门槛极低。

安装与基础使用

先通过 pip 一键安装:

pip install PyPDF2

标准文本型PDF的提取代码非常直观:

import PyPDF2

# 第一步:用 PdfReader 打开文件(注意 rb 二进制读模式)
with open("test.pdf", "rb") as f:
    reader = PyPDF2.PdfReader(f)
    # 获取总页数
    total_pages = len(reader.pages)
    print(f"当前文档共 {total_pages}\n")

    # 第二步:逐页提取并输出
    for i, page in enumerate(reader.pages, 1):
        content = page.extract_text()
        print(f"--- 第 {i} 页内容 ---")
        print(content.strip() or "(该页无标准文本或仅为图片页)\n")

✅ 这里加了个 or 判空提示,方便定位「非文本页」,更实用

常见问题与替代方案

  • 中文乱码PyPDF2对中文字体映射做得一般,试试 PyMuPDF(性能拉满)或 pdfminer.six(侧重布局,保留排版);
  • 扫描件PDF/OCR需求:上面的库都不行,得用 PaddleOCR + Tesseract 这类专门的 OCR 工具。

2. 基础PDF「小手术」:旋转、加密、合并

PyPDF2PdfWriter 是专门用来**生成/修改现有PDF的核心对象,搭配 PdfReader 就能完成绝大多数“文档级操作”。

2.1 单页/批量旋转

扫描件经常会歪,或者需要批量调整奇偶页方向?看这段👇

import PyPDF2

# 初始化读写对象
with open("manual.pdf", "rb") as f_in, open("rotated.pdf", "wb") as f_out:
    reader = PyPDF2.PdfReader(f_in)
    writer = PyPDF2.PdfWriter()

    for i, page in enumerate(reader.pages):
        # 旋转角度:正数是顺时针,负数是逆时针,必须是 90/180/270 的倍数
        if i % 2 == 0:  # 偶数页顺时针转90度
            page.rotate(90)
        writer.add_page(page)

    # 最后写入新文件
    writer.write(f_out)

2.2 批量加密敏感文件

薪资单、合同这类私密文档要批量加访问密码?一行代码搞定核心逻辑:

import PyPDF2
from pathlib import Path  # 路径处理更友好,自动批量操作的基础

# 批量加密文件夹下所有 PDF
source_dir = Path("./contracts/")
output_dir = Path("./encrypted_contracts/")
output_dir.mkdir(exist_ok=True)  # 没有输出文件夹自动建

for pdf_path in source_dir.glob("*.pdf"):
    with open(pdf_path, "rb") as f_in, open(output_dir / f"{pdf_path.stem}_加密.pdf", "wb") as f_out:
        reader = PyPDF2.PdfReader(f_in)
        writer = PyPDF2.PdfWriter()

        # 复制所有页
        for page in reader.pages:
            writer.add_page(page)

        # 设置密码:encrypt("访问密码", "修改密码",这里只设访问密码
        writer.encrypt("your_contract_password")
        writer.write(f_out)

print("✅ 所有合同加密完成!")

3. 批量叠加水印:页面合并的妙用

利用 page.merge_page() 可以把一个“水印页PDF”的内容,像素级叠加到目标PDF的每一页上——这种方法不会改变源文档的可读性和文字可编辑性,是批量打“内部资料”“草稿”“公司Logo水印”的标准做法。

准备工作

先自己做一个只有水印页PDF:用PPT/Word/PS都可以,只留水印元素就行,背景要设为**透明/白色(设白色的话,水印会覆盖掉PDF原来的文字哦,优先透明!

批量加水印代码

import PyPDF2
from pathlib import Path

source_dir = Path("./source_docs/")
output_dir = Path("./watermarked_docs/")
output_dir.mkdir(exist_ok=True)
watermark_path = Path("./watermark_template.pdf")  # 提前准备的透明水印页

# 打开水印阅读器,只需要读一次水印页
with open(watermark_path, "rb") as f_wm:
    wm_reader = PyPDF2.PdfReader(f_wm)
    wm_page = wm_reader.pages[0]

    # 批量处理源文件夹下的所有PDF
    for pdf_path in source_dir.glob("*.pdf"):
        with open(pdf_path, "rb") as f_in, open(output_dir / f"{pdf_path.stem}_带水印.pdf", "wb") as f_out:
            reader = PyPDF2.PdfReader(f_in)
            writer = PyPDF2.PdfWriter()

            for page in reader.pages:
                # 叠加水印:先合并,再添加到 writer
                page.merge_page(wm_page)
                writer.add_page(page)

            writer.write(f_out)

print("✅ 所有文档加水印完成!")

4. 从零生成专业PDF报告

如果要根据数据动态生成带**带自定义字体、图形、表格的报告,PyPDF2 就不够用了——必须上 reportlab,它是 Python 生成工业级 PDF 的“画板”。

安装与基础报告生成

先安装依赖:

pip install reportlab

带中文字体的简单报告代码

reportlab 默认不支持中文,需要**先注册本地的中文字体文件(比如 Windows 自带的 SimSun.ttf):

from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from pathlib import Path

# 第一步:准备字体路径(按需修改成你本地的中文字体)
# Windows 常用字体路径:C:/Windows/Fonts/
# macOS 常用字体路径:/System/Library/Fonts/
font_path = Path("SimSun.ttf")  # 如果放项目根目录也可以

# 第二步:初始化画布
c = canvas.Canvas("daoman_ai_report.pdf", pagesize=(595, 842))  # 默认A4尺寸:595x842像素

# 第三步:注册中文字体
pdfmetrics.registerFont(TTFont("SimSun", font_path))

# 第四步:绘制文字、图形、线条
c.setFont("SimSun", 24)
c.drawString(100, 750, "道满科技:202X 年度 AI 自动化趋势报告")

# 加一条分隔线
c.setStrokeColorRGB(0.2, 0.5, 0.8)  # 蓝色RGB
c.line(100, 730, 495, 730)
c.setStrokeColorRGB(0, 0, 0)  # 恢复黑色

# 绘制小标题
c.setFont("SimSun", 16)
c.drawString(100, 690, "一、核心功能覆盖场景")

# 绘制项目符号列表
c.setFont("SimSun", 12)
c.drawString(120, 660, "1. 批量文本/扫描件文档处理")
c.drawString(120, 630, "2. Excel/Word 模板自动填充")
c.drawString(120, 600, "3. 行业定制化报告生成")

# 第五步:保存画布
c.save()
print("✅ 报告生成成功!")

5. 总结与工具选型

工具库核心定位适用场景
PyPDF2文档「手术师」剪切/合并/旋转/加密/简单文本提取
reportlab报告「创作者」从零构建带自定义排版的专业PDF
PyMuPDF性能「推土机」复杂排版文本提取/高速PDF转图片
pdfminer.six布局「分析师」需要保留原文档文字位置的提取

💡 办公最佳实践:合同/报表这类对排版要求严格的,建议先用 Python 把 Excel 数据填入 Word 模板,最后再批量转成 PDF——既好维护排版,又能保证最终文件的不可篡改性!