处理 PDF 文件

PDF(Portable Document Format)是一种广泛使用的文件格式,用于展示和分享文档内容。PDF 文件可以包含文字、图片、图表、超链接以及其他复杂元素。它的主要优势在于跨平台兼容性。无论是在 Windows、Mac 还是移动设备上,PDF 文件的排版都能保持一致。因此,PDF 既是我们经常接触到的文件格式,也是我们常用的文件输出格式。对产品经理而言,我们经常需要使用 Python 来完成下列任务:

  • 文档生成:如自动生成合同、发票、报告等。
  • 数据提取和清理:从 PDF 中提取文字、表格数据或图片等,用于进一步分析或存储。
  • 文档批量处理:合并多个 PDF 文件,拆分单个文件,添加水印,或其他批量自动化处理等。

Python 自身并没有专门处理 PDF 的内置库。通常,我们使用第三方库来完成 PDF 相关的任务。常用的第三方库及其功能如下:

1. PyPDF2

  • 功能:读取、合并、拆分、旋转 PDF 文件。
  • 特点:轻量级,适合简单的 PDF 操作。
  • 常用功能
    • 提取页面内容。
    • 合并多个 PDF 文件。
    • 拆分 PDF 文件。

2. ReportLab

  • 功能:生成 PDF 文件。
  • 特点:支持复杂的排版和图形渲染,非常适合生成发票、图表等高定制化文档。
  • 常用功能
    • 创建带标题和表格的文档。
    • 添加图片和自定义样式。

3. pdfplumber

  • 功能:高效提取 PDF 中的文字和表格内容。
  • 特点:提取内容准确,适合从复杂布局的 PDF 中获取结构化数据。
  • 常用功能
    • 提取文本段落。
    • 提取并解析表格。

现在我们来看几个示例:

案例 1:批量合并 PDF 文件

场景描述
产品经理需要将多个团队提交的 PDF 报告合并为一个文件,方便整理和分享。

示例代码如下(使用 PyPDF2):

from PyPDF2 import PdfMerger

# 创建合并器对象
merger = PdfMerger()

# 添加多个 PDF 文件
files = ["report1.pdf", "report2.pdf", "report3.pdf"]
for file in files:
    merger.append(file)

# 保存合并后的文件
merger.write("merged_report.pdf")
merger.close()

print("PDF 文件已成功合并为 merged_report.pdf")

案例 2:从 PDF 中提取表格数据

场景描述
产品经理收到包含大量表格的 PDF 文件,需要提取表格内容以便进一步分析。

示例代码如下(使用 pdfplumber):

import pdfplumber

# 打开 PDF 文件
with pdfplumber.open("data_report.pdf") as pdf:
    for page in pdf.pages:
        table = page.extract_table()  # 提取表格数据
        if table:
            for row in table:
                print(row)  # 打印表格的每一行

案例 3:生成一份带表格的用户报告

场景描述
产品经理需要为 VIP 用户生成一份 PDF 报告,内容包括用户 ID、消费金额、最近一次登录日期等信息。

示例代码如下(使用 ReportLab):

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors

# 数据
data = [
    ["用户 ID", "消费金额", "最近登录日期"],
    [101, "$200", "2024-11-18"],
    [102, "$350", "2024-11-17"]
]

# 创建 PDF 文件
file_name = "user_report.pdf"
pdf = SimpleDocTemplate(file_name, pagesize=letter)

# 创建表格
table = Table(data)
table.setStyle(TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),  # 表头背景
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),  # 表头文字颜色
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),  # 居中对齐
    ('GRID', (0, 0), (-1, -1), 1, colors.black)  # 表格边框
]))

# 添加表格到 PDF
pdf.build([table])
print(f"用户报告已生成:{file_name}")

案例 4:为 PDF 添加水印

场景描述
产品经理希望在团队提交的 PDF 文档上添加“保密”水印,提升文档的安全性。

示例代码如下(使用 PyPDF2):

from PyPDF2 import PdfReader, PdfWriter

# 打开原始 PDF 和水印 PDF
original = PdfReader("team_report.pdf")
watermark = PdfReader("watermark.pdf")

# 创建写入器对象
writer = PdfWriter()

# 添加水印到每一页
for page in original.pages:
    page.merge_page(watermark.pages[0])  # 合并水印页
    writer.add_page(page)

# 保存新的 PDF 文件
with open("team_report_with_watermark.pdf", "wb") as output:
    writer.write(output)

print("水印已添加到 PDF 文件")

练习1:

请从一个 PDF 文件中提取所有文本内容。(例如:Transforming our world: the 2030 Agenda for Sustainable Development )。然后统计目标关键字(如 Innovation 或其他指定单词)的出现频率。将统计结果以清晰的格式写入文件 report.txt,内容如下:

PDF 文档词频统计报告
====================
文档名称: n1529189.pdf
关键字: Innovation
出现次数: 25

提示:

  • PDF 文本提取
    • 使用 pdfplumberpdf.pages 属性提取每一页的文本内容。
    • 使用字符串方法 .lower() 将文本转换为小写,方便关键字匹配。
  • 关键字统计
    • 使用 Python 的字符串方法 .count() 统计关键字的出现次数。
    • 如果关键字可能有变形或复数形式,可通过正则表达式(re 模块)提高匹配准确性。
  • 保存统计报告
    • 使用文件写操作将统计结果写入 report.txt,格式化输出。

练习2:

下列代码运行时出现错误,请找到代码中的问题,并修复错误。

import pdfplumber

# 打开 PDF 文件
with pdfplumber.open("/path/to/document.pdf") as pdf:
    for page in pdf.pages:
        text = page.extract_text()
        # 转码以处理可能的编码问题
        try:
            corrected_text = text.encode('latin1').decode('utf-8')
            print(corrected_text)
        except UnicodeDecodeError:
            print("文本包含复杂字符,转码失败")

程序运行后可能出现下列错误提示:

AttributeError: 'NoneType' object has no attribute 'encode'

提示:

  • 仔细阅读代码,观察错误提示并找到问题所在。
  • 修改代码,确保程序能够正确处理 PDF 提取的文本内容。
  • 确保修正后的代码能够处理包含复杂字符的 PDF 文本。

AI 助教

提示:您可在此提出学习中遇到的问题。回答由 AI 生成,可能存在错误,请注意甄别。