Python PDF处理实战指南:7个高效技巧解决日常文档操作难题
在数字化办公环境中,PDF文档处理已成为程序员日常工作的重要组成部分。Python PDF处理技术能够帮助我们解决文档合并、内容提取、页面调整等多种实际问题,提高工作效率。本文将通过"问题-方案-实践"的框架,介绍7个实用的Python PDF处理技巧,帮助你轻松应对各种文档操作挑战。
1. 快速合并多个PDF文件
场景痛点
当你需要将多个独立的PDF文档整合为一个完整文件时,手动操作不仅耗时,还容易出现顺序错误或遗漏页面的问题。特别是在处理大量报告或资料时,这个问题更加突出。
核心代码
以下是使用PyPDF库合并PDF文件的两种实现方案:
方案一:基本合并方法
from pypdf import PdfMerger
def merge_pdfs_basic(input_files, output_file):
"""
基本的PDF合并功能
参数:
input_files: 要合并的PDF文件路径列表
output_file: 合并后的输出文件路径
"""
# 创建PdfMerger对象,相当于准备一个空白的"拼图板"
merger = PdfMerger()
try:
# 遍历所有输入文件,将它们依次"拼"到拼图板上
for file in input_files:
# append方法会将整个PDF文件添加到合并结果中
merger.append(file)
# 将拼好的"拼图"保存到输出文件
merger.write(output_file)
print(f"成功合并{len(input_files)}个PDF文件到{output_file}")
except Exception as e:
print(f"合并过程出错: {str(e)}")
finally:
# 无论成功失败,都要关闭merger释放资源
merger.close()
# 使用示例
if __name__ == "__main__":
# 要合并的PDF文件列表
pdf_files = ["report_part1.pdf", "report_part2.pdf", "appendix.pdf"]
# 调用合并函数
merge_pdfs_basic(pdf_files, "complete_report.pdf")
方案二:高级合并方法(支持页面范围选择)
from pypdf import PdfMerger
def merge_pdfs_advanced(input_specs, output_file):
"""
高级PDF合并功能,支持选择页面范围
参数:
input_specs: 包含文件路径和页面范围的元组列表,格式为
(file_path, start_page, end_page),页码从0开始
output_file: 合并后的输出文件路径
"""
merger = PdfMerger()
try:
for spec in input_specs:
file_path, start_page, end_page = spec
# 只添加指定范围的页面,实现更精细的控制
merger.append(file_path, pages=(start_page, end_page))
merger.write(output_file)
print(f"成功合并指定页面到{output_file}")
except Exception as e:
print(f"合并过程出错: {str(e)}")
finally:
merger.close()
# 使用示例
if __name__ == "__main__":
# 每个元组包含(文件路径, 起始页, 结束页),页码从0开始计数
pdf_specs = [
("report_part1.pdf", 0, 5), # 取前6页
("report_part2.pdf", 2, 8), # 取第3到9页
("appendix.pdf", 0, None) # None表示到最后一页
]
merge_pdfs_advanced(pdf_specs, "custom_report.pdf")
效果对比
使用PyPDF合并PDF文件后,你将得到一个结构完整、页面顺序正确的单一PDF文档。
Python PDF处理合并效果展示,多个独立PDF文件被整合为一个完整文档
避坑指南
- 文件路径问题:确保所有输入文件的路径正确无误,避免因文件不存在导致合并失败
- 权限问题:确保程序对输入文件有读取权限,对输出目录有写入权限
- 大文件处理:合并大型PDF文件时可能会消耗较多内存,建议分批处理
- 版本兼容性:某些加密或特殊格式的PDF可能无法合并,需要先解密或转换格式
实操检查清单
- [ ] 确认所有待合并PDF文件都能正常打开
- [ ] 检查文件顺序是否符合预期
- [ ] 验证合并后的PDF是否包含所有必要页面
- [ ] 测试合并后的文件在不同PDF阅读器中是否正常显示
2. 为PDF文档添加水印保护
场景痛点
在分享敏感或机密文档时,如何确保文档来源可追溯、防止未授权传播是一个常见问题。传统的水印添加方法往往需要专业软件,操作复杂且效率低下。
核心代码
以下是两种为PDF添加水印的实现方案:
方案一:文本水印
from pypdf import PdfReader, PdfWriter
from pypdf.generic import AnnotationBuilder
def add_text_watermark(input_pdf, output_pdf, watermark_text, opacity=0.3):
"""
为PDF添加文本水印
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
watermark_text: 水印文本内容
opacity: 水印透明度,0-1之间,默认为0.3
"""
# 创建PDF读取器对象,用于读取原始文档
reader = PdfReader(input_pdf)
# 创建PDF写入器对象,用于生成新文档
writer = PdfWriter()
# 遍历原始PDF的每一页
for page in reader.pages:
# 创建文本水印注释
watermark = AnnotationBuilder.free_text(
watermark_text,
rect=(100, 400, 500, 500), # 水印位置和大小
font="Helvetica", # 字体
bold=True, # 粗体
italic=True, # 斜体
font_size="24pt", # 字体大小
color=(0.5, 0.5, 0.5), # 颜色 (RGB)
opacity=opacity # 透明度
)
# 将水印添加到当前页
page.add_annotation(watermark)
# 将添加了水印的页面添加到写入器
writer.add_page(page)
# 将结果写入输出文件
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功为PDF添加水印,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
add_text_watermark(
"confidential_report.pdf",
"watermarked_report.pdf",
"内部机密文档 - 请勿外传",
opacity=0.2
)
方案二:PDF水印(使用现有PDF作为水印源)
from pypdf import PdfReader, PdfWriter
from pypdf.transformations import Transformation
def add_pdf_watermark(input_pdf, watermark_pdf, output_pdf, opacity=0.3):
"""
使用PDF文件作为水印源为文档添加水印
参数:
input_pdf: 输入PDF文件路径
watermark_pdf: 作为水印的PDF文件路径
output_pdf: 输出PDF文件路径
opacity: 水印透明度,0-1之间,默认为0.3
"""
# 读取输入文档和水印文档
reader = PdfReader(input_pdf)
watermark_reader = PdfReader(watermark_pdf)
# 获取水印页面(假设水印在第一页)
watermark_page = watermark_reader.pages[0]
writer = PdfWriter()
# 遍历输入文档的每一页
for page in reader.pages:
# 创建一个新页面,大小与原页面相同
new_page = writer.add_blank_page(
width=page.mediabox.width,
height=page.mediabox.height
)
# 将原页面内容添加到新页面
new_page.merge_page(page)
# 调整水印大小和位置
scale = min(page.mediabox.width / watermark_page.mediabox.width,
page.mediabox.height / watermark_page.mediabox.height) * 0.5
# 创建变换:缩放并居中水印
transformation = Transformation()
transformation.scale(scale, scale)
transformation.translate(
(page.mediabox.width - watermark_page.mediabox.width * scale) / 2,
(page.mediabox.height - watermark_page.mediabox.height * scale) / 2
)
# 合并水印页面到新页面
new_page.merge_transformed_page(watermark_page, transformation, opacity=opacity)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功使用PDF水印,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
add_pdf_watermark(
"report.pdf",
"company_watermark.pdf",
"watermarked_report.pdf",
opacity=0.2
)
效果对比
添加水印后的PDF文档将在每一页都包含指定的水印内容,起到标识和保护作用。
Python PDF处理水印效果展示,红色"CONFIDENTIAL"水印清晰可见
避坑指南
- 水印位置:确保水印不会遮挡文档的关键内容,通常放在页面角落或中央但透明度较低
- 字体选择:选择清晰易读的字体,避免使用过于花哨的字体影响识别
- 透明度控制:透明度设置要适中,既能清晰看到水印,又不影响原文档阅读
- 批量处理:对多个文档添加相同水印时,考虑创建通用函数提高效率
实操检查清单
- [ ] 确认水印内容和格式符合要求
- [ ] 检查水印在不同页面尺寸上的显示效果
- [ ] 验证水印不会影响文档的可读性
- [ ] 测试在不同PDF阅读器中水印的显示效果
3. 实现PDF页面缩放与调整
场景痛点
在处理不同来源的PDF文档时,经常会遇到页面大小不一致的问题,这给文档打印、归档和阅读带来不便。手动调整每个页面的大小既耗时又容易出错。
核心代码
以下是两种实现PDF页面缩放的方法:
方案一:内容缩放(保持页面大小不变)
from pypdf import PdfReader, PdfWriter
from pypdf.transformations import Transformation
def scale_content(input_pdf, output_pdf, scale_factor):
"""
缩放PDF页面内容,保持页面大小不变
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
scale_factor: 缩放因子,大于1放大,小于1缩小
"""
# 读取输入PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# 遍历每一页
for page in reader.pages:
# 创建变换对象,用于缩放内容
transformation = Transformation().scale(scale_factor, scale_factor)
# 应用变换到页面内容
page.add_transformation(transformation)
# 将处理后的页面添加到写入器
writer.add_page(page)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功缩放PDF内容,缩放因子: {scale_factor},输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 缩小内容到80%
scale_content("original.pdf", "content_scaled.pdf", 0.8)
方案二:页面缩放(改变页面大小)
from pypdf import PdfReader, PdfWriter
def scale_page_size(input_pdf, output_pdf, target_width, target_height):
"""
调整PDF页面大小,同时缩放内容以适应新页面
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
target_width: 目标页面宽度(点,1英寸=72点)
target_height: 目标页面高度(点,1英寸=72点)
"""
reader = PdfReader(input_pdf)
writer = PdfWriter()
for page in reader.pages:
# 获取原始页面尺寸
original_width = page.mediabox.width
original_height = page.mediabox.height
# 计算宽度和高度的缩放比例
width_scale = target_width / original_width
height_scale = target_height / original_height
# 使用较小的缩放比例,确保内容完全在新页面内
scale_factor = min(width_scale, height_scale)
# 创建新页面
new_page = writer.add_blank_page(width=target_width, height=target_height)
# 计算内容在新页面中的位置(居中放置)
x_offset = (target_width - original_width * scale_factor) / 2
y_offset = (target_height - original_height * scale_factor) / 2
# 合并原始页面内容到新页面,并应用缩放和偏移
new_page.merge_scaled_page(page, scale_factor, tx=x_offset, ty=y_offset)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功调整PDF页面大小为 {target_width}x{target_height} 点,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 调整页面大小为A4 (595x842点)
scale_page_size("original.pdf", "page_scaled.pdf", 595, 842)
效果对比
通过内容缩放和页面缩放两种方法,你可以灵活调整PDF文档的显示效果。
Python PDF处理页面缩放效果对比,从左到右分别为原始页面、内容缩放和页面缩放效果
避坑指南
- 比例保持:缩放时注意保持原始页面的宽高比,避免内容变形
- 单位转换:PDF使用点(point)作为单位,1英寸=72点,1厘米≈28.35点
- 内容丢失:缩小页面时要确保重要内容不会被裁剪或变得过小无法阅读
- 性能考虑:对包含大量页面或高分辨率图像的PDF进行缩放可能需要较长时间和较多内存
实操检查清单
- [ ] 确认缩放后的内容清晰度满足需求
- [ ] 检查页面布局是否保持合理
- [ ] 验证所有内容都完整显示,没有被截断
- [ ] 测试在不同设备上的显示效果
4. 实现PDF页面旋转与方向调整
场景痛点
在扫描文档或处理不同来源的PDF时,经常会遇到页面方向不正确的问题。手动旋转每个页面既繁琐又容易出错,尤其是在处理包含大量页面的文档时。
核心代码
以下是两种实现PDF页面旋转的方法:
方案一:按固定角度旋转所有页面
from pypdf import PdfReader, PdfWriter
def rotate_all_pages(input_pdf, output_pdf, rotation_angle):
"""
将PDF所有页面按指定角度旋转
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
rotation_angle: 旋转角度,只能是0、90、180或270,正值为顺时针旋转
"""
# 验证旋转角度是否有效
if rotation_angle not in [0, 90, 180, 270]:
raise ValueError("旋转角度必须是0、90、180或270度")
# 读取输入PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# 遍历每一页并应用旋转
for page in reader.pages:
# 旋转页面,返回一个新的页面对象
rotated_page = page.rotate(rotation_angle)
# 将旋转后的页面添加到写入器
writer.add_page(rotated_page)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功将所有页面旋转{rotation_angle}度,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 将所有页面顺时针旋转90度
rotate_all_pages("portrait_document.pdf", "landscape_document.pdf", 90)
方案二:根据内容自动旋转页面
from pypdf import PdfReader, PdfWriter
def auto_rotate_pages(input_pdf, output_pdf):
"""
根据页面内容自动旋转PDF页面,使其正确方向显示
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
"""
reader = PdfReader(input_pdf)
writer = PdfWriter()
for page in reader.pages:
# 获取页面的旋转信息
current_rotation = page.get("/Rotate", 0)
# 获取页面的实际尺寸(考虑旋转)
width = page.mediabox.width
height = page.mediabox.height
# 判断是否需要旋转(如果宽>高但没有旋转,或高>宽但已旋转)
if (width > height and current_rotation == 0) or (height > width and current_rotation == 90):
# 需要旋转90度
rotated_page = page.rotate(90)
writer.add_page(rotated_page)
print(f"自动旋转页面 {len(writer.pages)}")
else:
# 不需要旋转,直接添加
writer.add_page(page)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功自动旋转PDF页面,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
auto_rotate_pages("scanned_document.pdf", "auto_rotated_document.pdf")
效果对比
旋转后的PDF页面将以正确的方向显示,提高文档的可读性。
Python PDF处理页面旋转效果展示,显示了旋转45度后的PDF页面效果
避坑指南
- 角度限制:PyPDF只支持0、90、180和270度的旋转,不支持其他角度
- 内容剪裁:旋转页面可能导致内容被裁剪,特别是当页面包含接近边缘的内容时
- 元数据保留:旋转操作可能会影响PDF的某些元数据,建议旋转后检查文档属性
- 性能问题:对包含大量页面的PDF进行旋转可能需要较长时间处理
实操检查清单
- [ ] 确认所有页面都旋转到正确方向
- [ ] 检查旋转后是否有内容被裁剪
- [ ] 验证文档的整体布局是否合理
- [ ] 测试在不同设备上的显示效果
5. 实现PDF文本高亮与注释添加
场景痛点
在阅读和分析PDF文档时,我们经常需要高亮重要内容或添加注释以便后续参考。手动操作效率低下,尤其当需要处理大量文档或重复高亮特定内容时。
核心代码
以下是两种实现PDF文本高亮和注释添加的方法:
方案一:手动指定位置添加高亮
from pypdf import PdfReader, PdfWriter
from pypdf.generic import AnnotationBuilder
def add_highlight_manual(input_pdf, output_pdf, page_num, rect_coords, color=(1, 1, 0)):
"""
在PDF指定位置添加高亮注释
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
page_num: 要添加高亮的页码(从0开始计数)
rect_coords: 高亮区域坐标,格式为(x1, y1, x2, y2)
color: 高亮颜色,RGB值,默认为黄色(1, 1, 0)
"""
# 读取输入PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# 检查页码是否有效
if page_num < 0 or page_num >= len(reader.pages):
raise ValueError(f"无效的页码: {page_num},文档共有{len(reader.pages)}页")
# 遍历所有页面
for i, page in enumerate(reader.pages):
# 如果是目标页面,添加高亮
if i == page_num:
# 创建高亮注释
highlight = AnnotationBuilder.highlight(
rect=rect_coords, # 高亮区域坐标
color=color # 高亮颜色
)
# 将高亮添加到页面
page.add_annotation(highlight)
# 将页面添加到写入器
writer.add_page(page)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功在第{page_num+1}页添加高亮,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 在第0页(第一页)添加黄色高亮
add_highlight_manual(
"report.pdf",
"highlighted_report.pdf",
page_num=0,
rect_coords=(100, 600, 300, 620) # 坐标需要根据实际文档调整
)
方案二:搜索文本并自动高亮
from pypdf import PdfReader, PdfWriter
from pypdf.generic import AnnotationBuilder
import re
def highlight_text_pattern(input_pdf, output_pdf, pattern, color=(1, 1, 0)):
"""
搜索PDF中的特定文本模式并自动添加高亮
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
pattern: 要搜索的文本模式(可以是字符串或正则表达式)
color: 高亮颜色,RGB值,默认为黄色(1, 1, 0)
"""
# 读取输入PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# 编译正则表达式
regex = re.compile(pattern, re.IGNORECASE)
# 遍历每一页
for page_num, page in enumerate(reader.pages):
# 提取页面文本
text = page.extract_text()
# 查找所有匹配的文本
matches = regex.finditer(text)
# 对于每个匹配,添加高亮
# 注意:PyPDF目前无法直接获取文本坐标,这里使用简化的位置估算
# 实际应用中可能需要更复杂的文本定位算法
# 这里仅作演示,实际使用时需要实现文本坐标检测逻辑
# 以下代码为概念演示,无法直接运行
for match in matches:
print(f"在第{page_num+1}页找到匹配: {match.group()}")
# 这里需要获取文本的实际坐标
# x1, y1, x2, y2 = get_text_coordinates(page, match)
# highlight = AnnotationBuilder.highlight(
# rect=(x1, y1, x2, y2),
# color=color
# )
# page.add_annotation(highlight)
# 将页面添加到写入器
writer.add_page(page)
# 保存结果
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功搜索并高亮文本模式: '{pattern}',输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 高亮所有"重要"或"关键"的文本
highlight_text_pattern(
"report.pdf",
"auto_highlighted_report.pdf",
r"(重要|关键|核心)"
)
效果对比
添加高亮后的PDF文档将突出显示重要内容,便于阅读和参考。
Python PDF处理文本高亮效果展示,显示了对"Crazy"一词的高亮标注
避坑指南
- 坐标系统:PDF使用从左下角为原点的坐标系统,与常见的屏幕坐标系统不同
- 文本定位:PyPDF目前没有直接获取文本坐标的功能,需要额外的文本定位算法
- 字体差异:不同字体和字号会影响文本位置和大小,可能需要针对不同文档调整参数
- 性能考虑:对包含大量文本的PDF进行全文搜索和高亮可能需要较长时间
实操检查清单
- [ ] 确认所有重要文本都被正确高亮
- [ ] 检查高亮颜色是否清晰可见但不影响文本阅读
- [ ] 验证高亮位置是否准确覆盖目标文本
- [ ] 测试在不同PDF阅读器中高亮是否正常显示
6. 实现PDF文档加密与权限控制
场景痛点
在分享敏感文档时,如何防止未授权访问和修改是一个重要问题。为PDF添加密码保护和权限控制可以有效保护文档安全。
核心代码
以下是实现PDF加密和权限控制的方法:
from pypdf import PdfReader, PdfWriter
def encrypt_pdf_document(input_pdf, output_pdf, user_password, owner_password=None, permissions=None):
"""
为PDF文档添加密码保护和权限控制
参数:
input_pdf: 输入PDF文件路径
output_pdf: 输出PDF文件路径
user_password: 用户密码,用于打开文档
owner_password: 所有者密码,用于修改权限(默认为None,将自动生成)
permissions: 权限设置字典,包含允许的操作
"""
# 读取输入PDF
reader = PdfReader(input_pdf)
writer = PdfWriter()
# 复制所有页面到写入器
for page in reader.pages:
writer.add_page(page)
# 设置默认权限(如果未提供)
if permissions is None:
permissions = {
"print": True, # 允许打印
"modify": False, # 禁止修改内容
"extract": False, # 禁止提取文本和图像
"annotate": False # 禁止添加注释
}
# 添加加密和权限设置
writer.encrypt(
user_password=user_password,
owner_password=owner_password,
use_128bit=True, # 使用128位加密(更安全)
permissions=permissions
)
# 保存加密后的PDF
with open(output_pdf, "wb") as f:
writer.write(f)
print(f"成功加密PDF文档,输出文件: {output_pdf}")
# 使用示例
if __name__ == "__main__":
# 定义文档权限
doc_permissions = {
"print": True, # 允许打印
"modify": False, # 禁止修改内容
"extract": True, # 允许提取文本和图像
"annotate": True # 允许添加注释
}
# 加密文档
encrypt_pdf_document(
"confidential.pdf",
"encrypted_confidential.pdf",
user_password="read_only_123",
owner_password="admin_456",
permissions=doc_permissions
)
效果对比
加密后的PDF文档在打开时需要输入密码,并且会根据设置限制特定操作。
graph TD
A[未加密PDF] -->|可以直接打开| B[查看所有内容]
A -->|可以修改| C[编辑文档内容]
A -->|可以复制| D[提取文本和图像]
E[加密PDF] -->|需要密码| F[输入正确密码]
F -->|用户密码| G[受限访问]
F -->|所有者密码| H[完全访问]
G -->|根据权限设置| I[部分功能可用]
H -->|所有功能可用| J[完全编辑权限]
PDF加密前后访问权限对比流程图
避坑指南
- 密码管理:确保妥善保管所有者密码,一旦丢失将无法恢复文档的完全访问权限
- 加密强度:使用128位加密提供更高的安全性,避免使用40位加密
- 权限设置:仔细设置权限,避免不必要的权限开放
- 兼容性考虑:某些旧版PDF阅读器可能不支持最新的加密标准
实操检查清单
- [ ] 确认加密后的文档需要密码才能打开
- [ ] 测试不同密码(用户密码和所有者密码)的访问权限
- [ ] 验证权限设置是否生效(尝试执行受限操作)
- [ ] 测试在不同PDF阅读器中的兼容性
7. 实现PDF文本提取与分析
场景痛点
从PDF文档中提取文本是许多数据处理和分析任务的基础。手动复制粘贴效率低下,尤其当需要处理大量文档或定期提取信息时。
核心代码
以下是两种实现PDF文本提取的方法:
方案一:基本文本提取
from pypdf import PdfReader
def extract_text_basic(pdf_path, output_txt=None, start_page=0, end_page=None):
"""
从PDF中提取文本内容
参数:
pdf_path: PDF文件路径
output_txt: 输出文本文件路径,为None则不保存到文件
start_page: 开始提取的页码(从0开始),默认为0
end_page: 结束提取的页码(不包含),为None则提取到最后一页
返回:
提取的文本内容
"""
# 读取PDF文件
reader = PdfReader(pdf_path)
# 确定提取范围
if end_page is None or end_page > len(reader.pages):
end_page = len(reader.pages)
# 验证页码范围
if start_page < 0 or start_page >= end_page:
raise ValueError(f"无效的页码范围: 开始页{start_page},结束页{end_page}")
# 提取文本
text = []
for page_num in range(start_page, end_page):
page = reader.pages[page_num]
# 提取页面文本
page_text = page.extract_text()
if page_text:
text.append(f"=== 第{page_num+1}页 ===")
text.append(page_text)
# 合并所有页面文本
full_text = "\n\n".join(text)
# 如果指定了输出文件,保存文本
if output_txt:
with open(output_txt, "w", encoding="utf-8") as f:
f.write(full_text)
print(f"成功提取文本到 {output_txt},共{len(reader.pages)}页")
return full_text
# 使用示例
if __name__ == "__main__":
# 提取整个PDF的文本
extracted_text = extract_text_basic(
"report.pdf",
output_txt="extracted_text.txt"
)
# 打印前500个字符
print(extracted_text[:500] + "...")
方案二:结构化文本提取与分析
from pypdf import PdfReader
import re
from collections import defaultdict
def analyze_pdf_content(pdf_path, keywords=None):
"""
分析PDF内容,提取结构化信息并统计关键词出现次数
参数:
pdf_path: PDF文件路径
keywords: 要统计的关键词列表
返回:
包含分析结果的字典
"""
# 读取PDF文件
reader = PdfReader(pdf_path)
# 初始化分析结果
analysis = {
"page_count": len(reader.pages),
"text_length": 0,
"page_text_lengths": [],
"keyword_counts": defaultdict(int) if keywords else None
}
# 遍历每一页
for page_num, page in enumerate(reader.pages):
page_text = page.extract_text() or ""
# 更新文本长度统计
page_length = len(page_text)
analysis["text_length"] += page_length
analysis["page_text_lengths"].append({
"page": page_num + 1,
"length": page_length
})
# 关键词统计
if keywords and page_text:
for keyword in keywords:
# 使用正则表达式查找关键词,不区分大小写
matches = re.findall(re.escape(keyword), page_text, re.IGNORECASE)
count = len(matches)
if count > 0:
analysis["keyword_counts"][keyword] += count
# 记录关键词出现的页面
if "keyword_pages" not in analysis:
analysis["keyword_pages"] = defaultdict(list)
analysis["keyword_pages"][keyword].append({
"page": page_num + 1,
"count": count
})
return analysis
# 使用示例
if __name__ == "__main__":
# 分析PDF内容并统计关键词
keywords = ["数据", "分析", "模型", "算法", "结果"]
analysis_result = analyze_pdf_content("research_paper.pdf", keywords)
# 打印分析结果
print(f"PDF分析结果:")
print(f"总页数: {analysis_result['page_count']}")
print(f"总文本长度: {analysis_result['text_length']}字符")
print("关键词出现次数:")
for keyword, count in analysis_result["keyword_counts"].items():
print(f" {keyword}: {count}次")
效果对比
文本提取功能可以将PDF中的文本内容转换为可编辑和分析的文本格式,大大提高信息处理效率。
graph LR
A[PDF文档] -->|文本提取| B[原始文本]
B -->|结构化处理| C[章节标题]
B -->|结构化处理| D[正文内容]
B -->|结构化处理| E[表格数据]
B -->|结构化处理| F[参考文献]
C -->|分析| G[文档结构分析]
D -->|分析| H[内容主题提取]
E -->|分析| I[数据统计与可视化]
PDF文本提取与分析流程
避坑指南
- 扫描PDF限制:纯图像的扫描PDF无法直接提取文本,需要先进行OCR处理
- 格式保留:文本提取通常会丢失原始格式信息,如字体、排版等
- 复杂布局:包含复杂表格、图表或多栏布局的PDF可能导致提取的文本顺序混乱
- 性能考虑:提取包含大量页面或图像的PDF可能需要较长时间和较多内存
实操检查清单
- [ ] 确认提取的文本完整且没有丢失重要内容
- [ ] 检查文本顺序是否与原始PDF一致
- [ ] 验证特殊字符是否正确提取
- [ ] 测试对不同类型PDF(文本型、扫描型、混合型)的提取效果
总结
通过本文介绍的7个Python PDF处理技巧,你可以有效解决日常工作中遇到的各种PDF文档操作难题。从基本的文档合并、页面调整,到高级的文本提取和权限控制,Python PDF处理技术为我们提供了高效、灵活的解决方案。
无论是需要处理单个文档还是批量处理大量文件,这些技巧都能帮助你提高工作效率,减少重复劳动。随着对这些技术的熟练应用,你将能够应对更加复杂的PDF处理任务,为数据处理和文档管理提供有力支持。
记住,实践是掌握这些技能的关键。尝试将这些代码应用到你的实际工作中,并根据具体需求进行调整和扩展。随着经验的积累,你将发现Python PDF处理技术在提高工作效率方面的巨大潜力。
最后,保持对新技术和方法的关注,PDF处理技术也在不断发展,新的功能和改进会不断出现。持续学习和实践,你将成为PDF处理的专家,为你的工作带来更多便利和价值。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust099- DDeepSeek-V4-ProDeepSeek-V4-Pro(总参数 1.6 万亿,激活 49B)面向复杂推理和高级编程任务,在代码竞赛、数学推理、Agent 工作流等场景表现优异,性能接近国际前沿闭源模型。Python00
MiMo-V2.5-ProMiMo-V2.5-Pro作为旗舰模型,擅⻓处理复杂Agent任务,单次任务可完成近千次⼯具调⽤与⼗余轮上 下⽂压缩。Python00
GLM-5.1GLM-5.1是智谱迄今最智能的旗舰模型,也是目前全球最强的开源模型。GLM-5.1大大提高了代码能力,在完成长程任务方面提升尤为显著。和此前分钟级交互的模型不同,它能够在一次任务中独立、持续工作超过8小时,期间自主规划、执行、自我进化,最终交付完整的工程级成果。Jinja00
Kimi-K2.6Kimi K2.6 是一款开源的原生多模态智能体模型,在长程编码、编码驱动设计、主动自主执行以及群体任务编排等实用能力方面实现了显著提升。Python00
MiniMax-M2.7MiniMax-M2.7 是我们首个深度参与自身进化过程的模型。M2.7 具备构建复杂智能体应用框架的能力,能够借助智能体团队、复杂技能以及动态工具搜索,完成高度精细的生产力任务。Python00




