Python自动化办公入门指南(五):PDF自动化实战
Python自动化办公入门指南,PDF自动化,代码实战,get新技能
·
目录
前言
PDF文档因其跨平台、格式固定的特性,在办公场景中广泛应用。然而,PDF的处理往往比普通文档更加复杂。本篇将深入讲解如何使用Python实现PDF文档的自动化处理。
一、环境准备与基础操作
1. 安装必要库
pip install PyPDF2 pdfminer.six pdf2image
2. 读取PDF基本信息
import PyPDF2
def get_pdf_info(pdf_path):
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfFileReader(file)
info = {
'页数': reader.getNumPages(),
'作者': reader.getDocumentInfo().author,
'标题': reader.getDocumentInfo().title,
'创建时间': reader.getDocumentInfo().creationDate
}
return info
# 使用示例
pdf_info = get_pdf_info('示例文档.pdf')
print(pdf_info)
二、PDF文件处理
1. PDF拆分与合并
def split_pdf(pdf_path, output_folder):
with open(pdf_path, 'rb') as file:
reader = PyPDF2.PdfFileReader(file)
for i in range(reader.getNumPages()):
writer = PyPDF2.PdfFileWriter()
writer.addPage(reader.getPage(i))
output_path = f"{output_folder}/page_{i+1}.pdf"
with open(output_path, 'wb') as output_file:
writer.write(output_file)
def merge_pdfs(pdf_list, output_path):
merger = PyPDF2.PdfFileMerger()
for pdf in pdf_list:
merger.append(pdf)
merger.write(output_path)
merger.close()
# 使用示例
split_pdf('示例文档.pdf', 'output_pages')
merge_pdfs(['file1.pdf', 'file2.pdf'], '合并文档.pdf')
2. PDF加密与解密
def encrypt_pdf(input_path, output_path, password):
with open(input_path, 'rb') as file:
reader = PyPDF2.PdfFileReader(file)
writer = PyPDF2.PdfFileWriter()
for i in range(reader.getNumPages()):
writer.addPage(reader.getPage(i))
writer.encrypt(password)
with open(output_path, 'wb') as output_file:
writer.write(output_file)
def decrypt_pdf(input_path, output_path, password):
with open(input_path, 'rb') as file:
reader = PyPDF2.PdfFileReader(file)
if reader.isEncrypted:
reader.decrypt(password)
writer = PyPDF2.PdfFileWriter()
for i in range(reader.getNumPages()):
writer.addPage(reader.getPage(i))
with open(output_path, 'wb') as output_file:
writer.write(output_file)
# 使用示例
encrypt_pdf('示例文档.pdf', '加密文档.pdf', 'mypassword')
decrypt_pdf('加密文档.pdf', '解密文档.pdf', 'mypassword')
三、PDF内容提取
1. 提取文本内容
from pdfminer.high_level import extract_text
def extract_pdf_text(pdf_path):
text = extract_text(pdf_path)
return text
# 使用示例
text = extract_pdf_text('示例文档.pdf')
print(text[:500]) # 打印前500个字符
2. 提取表格数据
import pdfplumber
def extract_tables(pdf_path):
tables = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
tables.extend(page.extract_tables())
return tables
# 使用示例
tables = extract_tables('示例文档.pdf')
for i, table in enumerate(tables):
print(f"表格{i+1}:")
for row in table:
print(row)
3. 提取图片
from pdf2image import convert_from_path
def extract_images(pdf_path, output_folder):
images = convert_from_path(pdf_path)
for i, image in enumerate(images):
image.save(f"{output_folder}/page_{i+1}.png", 'PNG')
# 使用示例
extract_images('示例文档.pdf', 'output_images')
四、PDF与Word互转
1. PDF转Word
from pdf2docx import Converter
def pdf_to_word(pdf_path, docx_path):
cv = Converter(pdf_path)
cv.convert(docx_path, start=0, end=None)
cv.close()
# 使用示例
pdf_to_word('示例文档.pdf', '转换文档.docx')
2. Word转PDF
from docx2pdf import convert
def word_to_pdf(docx_path, pdf_path):
convert(docx_path, pdf_path)
# 使用示例
word_to_pdf('示例文档.docx', '转换文档.pdf')
五、PDF批量处理
1. 批量重命名PDF文件
import os
def batch_rename_pdf(folder_path, prefix):
for i, filename in enumerate(os.listdir(folder_path)):
if filename.endswith('.pdf'):
new_name = f"{prefix}_{i+1}.pdf"
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
# 使用示例
batch_rename_pdf('pdf_folder', '合同')
2. 批量添加水印
from PyPDF2 import PdfFileReader, PdfFileWriter
def add_watermark(input_pdf, output_pdf, watermark_pdf):
watermark = PdfFileReader(watermark_pdf)
watermark_page = watermark.getPage(0)
reader = PdfFileReader(input_pdf)
writer = PdfFileWriter()
for i in range(reader.getNumPages()):
page = reader.getPage(i)
page.mergePage(watermark_page)
writer.addPage(page)
with open(output_pdf, 'wb') as output_file:
writer.write(output_file)
def batch_add_watermark(folder_path, watermark_pdf):
for filename in os.listdir(folder_path):
if filename.endswith('.pdf'):
input_path = os.path.join(folder_path, filename)
output_path = os.path.join(folder_path, f"watermarked_{filename}")
add_watermark(input_path, output_path, watermark_pdf)
# 使用示例
batch_add_watermark('pdf_folder', '水印模板.pdf')
六、综合案例:自动化PDF报告生成
def generate_pdf_report(data, template_path, output_path):
# 创建Word文档
doc = Document(template_path)
# 填充数据
replacements = {
'{标题}': data['标题'],
'{日期}': data['日期'],
'{作者}': data['作者'],
'{内容}': data['内容']
}
for para in doc.paragraphs:
for run in para.runs:
for old_text, new_text in replacements.items():
if old_text in run.text:
run.text = run.text.replace(old_text, new_text)
# 保存为临时Word文件
temp_docx = 'temp_report.docx'
doc.save(temp_docx)
# 转换为PDF
word_to_pdf(temp_docx, output_path)
# 清理临时文件
os.remove(temp_docx)
# 使用示例
report_data = {
'标题': '2023年第三季度报告',
'日期': '2023-09-30',
'作者': '数据分析部',
'内容': '本季度销售额同比增长15%,主要得益于...'
}
generate_pdf_report(report_data, '报告模板.docx', '季度报告.pdf')
七、实践建议
1. 文件管理
-
建立标准文件命名规范
-
使用版本控制管理重要文档
-
定期备份处理结果
2.性能优化
-
批量处理时使用多线程
-
缓存常用模板和水印文件
-
优化PDF处理顺序减少IO操作
3.安全考虑
-
处理敏感PDF时使用加密
-
验证输入文件格式
-
设置合理的文件权限
八、下期预告
在下一篇文章中,我们将深入讲解邮件自动化实战,包括:
-
使用smtplib发送邮件
-
自动添加附件
-
定时发送报告
-
邮件内容模板化
记住:
-
从简单的PDF处理任务开始
-
逐步建立自己的PDF处理工具库
-
将常用功能封装成可复用模块
更多推荐

所有评论(0)