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 文本提取:
- 使用
pdfplumber的pdf.pages属性提取每一页的文本内容。 - 使用字符串方法
.lower()将文本转换为小写,方便关键字匹配。
- 使用
- 关键字统计:
- 使用 Python 的字符串方法
.count()统计关键字的出现次数。 - 如果关键字可能有变形或复数形式,可通过正则表达式(
re模块)提高匹配准确性。
- 使用 Python 的字符串方法
- 保存统计报告:
- 使用文件写操作将统计结果写入
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 生成,可能存在错误,请注意甄别。
