使用Python处理PDF文件的常见操作与实战
本文介绍如何利用Python生态中的PyPDF2、pdfminer.six与reportlab等工具,完成PDF文本读取、图片提取、新建生成以及拆分合并等常见操作。包含基础环境配置、核心代码示例与注意事项,适用于日常文档自动化处理场景。
Python处理PDF的核心工具简介
在现代数字化办公中,PDF已成为标准的跨平台文档格式。Python凭借丰富的第三方库生态,能够高效完成从解析、编辑到生成的全流程自动化。常用的基础库包括PyPDF2(侧重结构与页面操作)、pdfminer.six(专注高精度文本提取)以及reportlab(用于程序化生成PDF)。掌握这些工具的接口,即可快速搭建文档处理流水线。
环境准备与依赖安装
第1步:安装Python处理依赖库
确保系统已安装Python 3.6及以上版本。通过内置的包管理工具下载并锁定所需库的当前稳定版,后续所有文件解析与生成均依赖此基础环境。
pip install PyPDF2 pdfminer.six reportlab
常见PDF处理操作详解
第2步:读取PDF文本内容
获取PDF内的可编辑文本是数据分析与归档的基础步骤。通过逐页遍历并调用文本抽取方法,可将散落在各页面的字符拼接为完整字符串,便于后续正则匹配或存储到数据库。
import PyPDF2
def read_pdf(file_path):
# 使用二进制只读模式打开文件
with open(file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file)
num_pages = pdf_reader.numPages
text = ''
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
page_text = page.extract_text()
if page_text:
text += page_text + '\n'
return text
# 替换为你的实际文件路径
pdf_text = read_pdf('example.pdf')
print(pdf_text[:200]) # 打印前200个字符核对结果第3步:提取页面内嵌图片资源
部分PDF作为电子相册或设计稿时,会直接封装图像流。通过定位页面资源对象(XObject)并筛选图像子类型,可剥离原始像素数据进行保存。⚠️注意:不同版本的PDF加密或压缩算法可能导致直接提取的二进制流与预期格式不符。
import PyPDF2
def extract_images(file_path):
with open(file_path, 'rb') as file:
pdf_reader = PyPDF2.PdfFileReader(file)
num_pages = pdf_reader.numPages
images = []
for page_num in range(num_pages):
page = pdf_reader.getPage(page_num)
resources = page.get('/Resources', {})
x_object = resources.get('/XObject', {})
if not x_object:
continue
for obj_key in x_object:
obj = x_object[obj_key]
# 判断是否为图像对象
if obj.get('/Subtype') == '/Image':
images.append(obj)
return images
# 执行提取
pdf_images = extract_images('example.pdf')
for i, img_obj in enumerate(pdf_images):
img_data = img_obj.getData()
# 根据实际压缩类型决定后缀名(例如 /DCTDecode 为 .jpg)
with open(f'image_raw_{i}.bin', 'wb') as f:
f.write(img_data)第4步:创建基础PDF文档
当需要将结构化数据导出为标准报表时,可使用reportlab构建空白画布并绘制元素。该方式完全由代码驱动,适合定时任务自动生成合同、发票或统计图表底稿。
from reportlab.pdfgen import canvas
def create_pdf(file_path):
c = canvas.Canvas(file_path)
# 设置字体与字号
c.setFont("Helvetica", 12)
# 坐标原点默认在左下角(100, 700)处绘制标题
c.drawString(100, 700, "Hello, Generated PDF!")
# 添加内嵌图片占位测试
image_path = "cover.jpg"
c.drawImage(image_path, 100, 500, width=200, height=150, preserveAspectRatio=True)
# 保存并关闭文件句柄
c.save()
# 生成输出
create_pdf("output_new.pdf")第5步:合并与拆分PDF文件
面对多份零散资料或超长报告,按需求合并分卷或拆分归档能大幅提升管理效率。合并操作按顺序追加页面,拆分则逐个写入独立文件。⚠️重要提醒:覆盖同名输出文件不可逆,建议在写入前清理目标目录或检查文件存在状态。
import PyPDF2
import os
def merge_pdfs(input_files, output_file):
# 备份风险提醒:若output_file已存在将被完全覆盖
if os.path.exists(output_file):
print(f"警告:{output_file} 已存在,即将被覆盖。")
merger = PyPDF2.PdfFileMerger()
for f_path in input_files:
if os.path.isfile(f_path):
merger.append(f_path)
else:
print(f"跳过不存在的路径:{f_path}")
with open(output_file, 'wb') as f_out:
merger.write(f_out)
def split_pdf(input_file, output_prefix):
with open(input_file, 'rb') as f_in:
reader = PyPDF2.PdfFileReader(f_in)
total = reader.numPages
for idx in range(total):
writer = PyPDF2.PdfFileWriter()
writer.addPage(reader.getPage(idx))
part_name = f"{output_prefix}_page_{idx+1}.pdf"
with open(part_name, 'wb') as f_part:
writer.write(f_part)
# 执行合并与拆分
merge_pdfs(['part_a.pdf', 'part_b.pdf'], 'combined.pdf')
split_pdf('large_report.pdf', 'split_output')注意事项与进阶排错
实际业务中常遇到编码乱码、扫描版PDF无法读取文字或内存溢出等问题。若extract_text()返回空字符串,说明页面仅含矢量图形或扫描件,需接入OCR引擎。针对超大文件逐页读取易触发内存泄漏,建议配合生成器模式按需加载。此外,PyPDF2的旧版接口在部分复杂排版上兼容性有限,长期项目可平滑迁移至功能更完善的pypdf或pdfplumber。
总结
以上就是利用Python编写PDF读取提取合并创建代码的详细内容,更多关于Python自动化办公与文档处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













