今天,我分享一下实用的Python PDF处理技巧,包括页面提取、文档合并、水印添加等高级功能,让你的文档处理效率再上一个台阶!
功能亮点
这个增强版的Python脚本包含以下强大功能:
- 从PDF中提取指定页面范围
- 智能合并多个PDF文档
- 为PDF添加自定义水印
- 提取PDF中的文本和图片内容
- 批量重命名PDF文件
让我们深入探索这些功能的实现细节。
环境准备与模块导入
首先,我们需要安装必要的库并导入相关模块:
import os
import re
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
from reportlab.lib.pagesizes import A4
from reportlab.pdfgen import canvas
from reportlab.lib.utils import ImageReader
import io
from PIL import Image
import shutil
这些库中,PyPDF2负责PDF的核心操作,reportlab用于创建PDF和水印,PIL用于图像处理。
功能一:PDF页面提取
提取PDF中的特定页面是一个非常实用的功能:
def extract_pages(input_pdf, output_pdf, start_page, end_page):
"""
从PDF中提取指定页面范围
:param input_pdf: 输入PDF文件路径
:param output_pdf: 输出PDF文件路径
:param start_page: 起始页码(从0开始)
:param end_page: 结束页码
"""
try:
with open(input_pdf, 'rb') as file:
pdf_reader = PdfFileReader(file)
pdf_writer = PdfFileWriter()
# 验证页码范围
if end_page > pdf_reader.numPages or start_page < 0:
raise ValueError("页码超出范围")
# 提取指定页面
for page_num in range(start_page, end_page + 1):
page = pdf_reader.getPage(page_num)
pdf_writer.addPage(page)
# 保存提取的页面
with open(output_pdf, 'wb') as output_file:
pdf_writer.write(output_file)
print(f"成功提取页面 {start_page}-{end_page} 到 {output_pdf}")
return True
except Exception as e:
print(f"提取页面时出错: {str(e)}")
return False
这个函数可以精确提取PDF文档中的任何页面范围,非常适合从大型文档中获取需要的部分。
功能二:智能PDF合并
与简单的合并不同,这个智能合并功能提供了更多选项:
def smart_merge_pdfs(pdf_list, output_path, bookmarks=True, progress_callback=None):
"""
智能合并多个PDF文件
:param pdf_list: PDF文件路径列表
:param output_path: 输出文件路径
:param bookmarks: 是否添加书签
:param progress_callback: 进度回调函数
"""
merger = PdfFileMerger()
for i, pdf_path in enumerate(pdf_list):
try:
if progress_callback:
progress_callback(i, len(pdf_list), f"处理 {os.path.basename(pdf_path)}")
if bookmarks:
# 使用文件名作为书签
bookmark_name = os.path.splitext(os.path.basename(pdf_path))[0]
merger.append(pdf_path, bookmark=bookmark_name)
else:
merger.append(pdf_path)
except Exception as e:
print(f"处理文件 {pdf_path} 时出错: {str(e)}")
continue
# 执行合并
merger.write(output_path)
merger.close()
if progress_callback:
progress_callback(len(pdf_list), len(pdf_list), "合并完成")
print(f"PDF文件已成功合并到: {output_path}")
return True
智能合并不仅添加书签,还包含进度跟踪和错误处理,确保合并过程稳定可靠。
功能三:PDF水印添加
为PDF添加水印是保护文档版权的有效方法:
def create_watermark(text, font_size=40, opacity=0.3, rotation=45):
"""
创建水印PDF
:param text: 水印文字
:param font_size: 字体大小
:param opacity: 透明度
:param rotation: 旋转角度
"""
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=A4)
can.setFont("Helvetica", font_size)
can.setFillColorRGB(0.5, 0.5, 0.5, opacity) # 灰色,半透明
# 计算页面中心
width, height = A4
can.saveState()
can.translate(width / 2, height / 2)
can.rotate(rotation)
# 绘制水印文字
text_width = can.stringWidth(text, "Helvetica", font_size)
can.drawString(-text_width / 2, 0, text)
can.restoreState()
can.save()
packet.seek(0)
return PdfFileReader(packet)
def add_watermark_to_pdf(input_pdf, output_pdf, watermark_text):
"""
为PDF添加水印
"""
watermark = create_watermark(watermark_text)
watermark_page = watermark.getPage(0)
pdf_reader = PdfFileReader(input_pdf)
pdf_writer = PdfFileWriter()
for page_num in range(pdf_reader.numPages):
page = pdf_reader.getPage(page_num)
page.mergePage(watermark_page)
pdf_writer.addPage(page)
with open(output_pdf, 'wb') as output_file:
pdf_writer.write(output_file)
print(f"水印已成功添加到: {output_pdf}")
这个水印功能支持自定义文字、透明度、旋转角度,可以创建专业水准的水印效果。
功能四:PDF内容提取
从PDF中提取文本和图片对于内容分析非常有用:
def extract_text_from_pdf(pdf_path, output_txt=None):
"""
从PDF中提取文本内容
"""
try:
with open(pdf_path, 'rb') as file:
pdf_reader = PdfFileReader(file)
text_content = ""
for page_num in range(pdf_reader.numPages):
page = pdf_reader.getPage(page_num)
text_content += f"\n--- 第 {page_num + 1} 页 ---\n"
text_content += page.extractText() + "\n"
if output_txt:
with open(output_txt, 'w', encoding='utf-8') as txt_file:
txt_file.write(text_content)
print(f"文本内容已保存到: {output_txt}")
return text_content
except Exception as e:
print(f"提取文本时出错: {str(e)}")
return None
def extract_images_from_pdf(pdf_path, output_folder):
"""
从PDF中提取图片(基础版本)
"""
if not os.path.exists(output_folder):
os.makedirs(output_folder)
# 注意:这是一个简化的图片提取示例
# 实际应用中可能需要使用pdf2image或其他专门库
print(f"图片提取功能需要额外的依赖库,请确保已安装pdf2image")
功能五:批量文件重命名
整理PDF文件时,批量重命名功能非常实用:
def batch_rename_pdfs(folder_path, pattern, new_pattern):
"""
批量重命名PDF文件
:param folder_path: 文件夹路径
:param pattern: 原文件名模式(正则表达式)
:param new_pattern: 新文件名模式
"""
pdf_files = [f for f in os.listdir(folder_path)
if f.lower().endswith('.pdf')]
renamed_count = 0
for filename in pdf_files:
new_name = re.sub(pattern, new_pattern, filename)
if new_name != filename:
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, new_name)
# 避免文件名冲突
counter = 1
while os.path.exists(new_path):
name, ext = os.path.splitext(new_name)
new_path = os.path.join(folder_path, f"{name}_{counter}{ext}")
counter += 1
os.rename(old_path, new_path)
renamed_count += 1
print(f"重命名: {filename} -> {os.path.basename(new_path)}")
print(f"共重命名 {renamed_count} 个文件")
return renamed_count
综合应用示例
让我们看看如何将这些功能组合使用:
def process_pdf_workflow(work_folder):
"""
PDF处理工作流示例
"""
# 1. 批量重命名
print("步骤1: 批量重命名PDF文件")
batch_rename_pdfs(work_folder, r'\s+', '_') # 将空格替换为下划线
# 2. 获取所有PDF文件
pdf_files = [os.path.join(work_folder, f)
for f in os.listdir(work_folder)
if f.lower().endswith('.pdf')]
if not pdf_files:
print("未找到PDF文件")
return
# 3. 添加水印
print("步骤2: 为PDF添加水印")
watermarked_files = []
for pdf_file in pdf_files:
output_name = f"watermarked_{os.path.basename(pdf_file)}"
output_path = os.path.join(work_folder, output_name)
add_watermark_to_pdf(pdf_file, output_path, "机密文档")
watermarked_files.append(output_path)
# 4. 合并文档
print("步骤3: 合并PDF文档")
merged_pdf = os.path.join(work_folder, "merged_document.pdf")
smart_merge_pdfs(watermarked_files, merged_pdf)
# 5. 提取文本内容
print("步骤4: 提取文本内容")
extract_text_from_pdf(merged_pdf,
os.path.join(work_folder, "extracted_text.txt"))
print("PDF处理工作流完成!")
if __name__ == "__main__":
work_folder = r"C:\Users\YourName\Documents\PDF_Work"
process_pdf_workflow(work_folder)
实用技巧与最佳实践
- 错误处理:所有函数都包含异常处理,确保程序稳定性
- 进度反馈:长时间操作提供进度提示
- 文件验证:操作前验证文件存在性和格式正确性
- 资源清理:及时关闭文件句柄,避免资源泄露
性能优化建议
- 对于大型PDF文件,考虑使用内存映射文件
- 批量操作时使用多线程处理
- 定期清理临时文件释放磁盘空间
扩展思路
这个脚本还可以进一步扩展:
- 添加PDF加密/解密功能
- 实现OCR文字识别
- 集成云存储服务
- 添加图形用户界面
结语
通过这些Python脚本,我们实现了PDF文档的全面自动化处理。无论是个人文档管理还是企业级应用,这些工具都能显著提高工作效率。
自动化处理不仅节省时间,还能减少人为错误,确保处理结果的一致性。掌握这些技能,你将能够在文档处理方面游刃有余。
希望这篇进阶教程对你有所帮助!如果你有任何问题或想要了解更多功能,欢迎在评论区交流讨论。记得关注我,获取更多Python办公自动化的实用技巧!