
Python自动化操作PDF主要使用PyPDF2、ReportLab、PDFMiner等主流库,涵盖文本提取、文档生成、页面操作和格式转换等高频需求,合理使用能提升自动化的水平与文档处理效率。
1、合并多个PDF文件 使用PdfMerger高效合并文档,支持批量处理:
from PyPDF2 import PdfMerger
def merge_pdfs(paths, output):
merger = PdfMerger()
for pdf in paths:
merger.append(pdf)
merger.write(output)
merger.close()
merge_pdfs(['doc1.pdf', 'doc2.pdf'], 'merged.pdf') # 合并doc1和doc22、拆分PDF文件 按页码范围提取特定页面:
from PyPDF2 import PdfReader, PdfWriter
def split_pdf(input_path, output_path, start_page, end_page):
reader = PdfReader(input_path)
writer = PdfWriter()
for i in range(start_page-1, end_page):
writer.add_page(reader.pages[i])
with open(output_path, 'wb') as f:
writer.write(f)
split_pdf('input.pdf', 'split.pdf', 1, 3) # 提取第1-3页3、加密PDF文件 添加AES-256加密保护:
from PyPDF2 import PdfWriter, PdfReader
def encrypt_pdf(input_path, output_path, password):
reader = PdfReader(input_path)
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
writer.encrypt(password)
with open(output_path, 'wb') as f:
writer.write(f)
encrypt_pdf('doc.pdf', 'encrypted.pdf', 'mypassword') # 设置密码4、解密PDF文件 解除文件访问限制:
from PyPDF2 import PdfReader, PdfWriter
def decrypt_pdf(input_path, output_path, password):
reader = PdfReader(input_path)
if reader.is_encrypted:
reader.decrypt(password) # 验证密码
writer = PdfWriter()
for page in reader.pages:
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)5、添加文本到PDF页面 利用ReportLab动态插入文字(如签名、批注):
from PyPDF2 import PdfReader, PdfWriter
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
import io
def add_text(input_path, output_path, text, x, y):
packet = io.BytesIO()
can = canvas.Canvas(packet, pagesize=letter)
can.drawString(x, y, text) # 在坐标(x,y)处绘制文本
can.save()
packet.seek(0)
existing_pdf = PdfReader(open(input_path, "rb"))
writer = PdfWriter()
page = existing_pdf.pages[0]
new_pdf = PdfReader(packet)
page.merge_page(new_pdf.pages[0])
writer.add_page(page)
for i in range(1, len(existing_pdf.pages)):
writer.add_page(existing_pdf.pages[i])
with open(output_path, "wb") as f:
writer.write(f)
add_text('doc.pdf', 'annotated.pdf', 'APPROVED', 100, 500)
6、添加水印 将文字或Logo作为水印嵌入:
from PyPDF2 import PdfWriter, PdfReader
from reportlab.pdfgen import canvas
def add_watermark(input_pdf, output_pdf, watermark_text):
# 创建水印模板
packet = io.BytesIO()
can = canvas.Canvas(packet)
can.setFont("Helvetica", 40)
can.setFillAlpha(0.2) # 设置透明度
can.drawCentredString(300, 400, watermark_text)
can.save()
# 合并水印
watermark = PdfReader(packet)
writer = PdfWriter()
for page in PdfReader(input_pdf).pages:
# 从 watermark 中获取第一页并合并
page.merge_page(watermark.pages[0])
writer.add_page(page)
with open(output_pdf, "wb") as f:
writer.write(f)
add_watermark('report.pdf', 'watermarked.pdf', 'CONFIDENTIAL')
7、删除指定页面 清理不需要的页面:
from PyPDF2 import PdfReader, PdfWriter
def remove_pages(input_path, output_path, pages_to_remove):
reader = PdfReader(input_path)
writer = PdfWriter()
for i, page in enumerate(reader.pages):
if i+1 not in pages_to_remove: # 跳过需删除的页码
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
remove_pages('input.pdf', 'clean.pdf', [2, 4]) # 删除第2页和第4页8、旋转页面 调整扫描文档方向:
from PyPDF2 import PdfReader, PdfWriter
def rotate_pages(input_path, output_path, angle, target_pages):
reader = PdfReader(input_path)
writer = PdfWriter()
for i, page in enumerate(reader.pages):
if i+1 in target_pages:
page.rotate(angle) # 支持90/180/270度
writer.add_page(page)
with open(output_path, 'wb') as f:
writer.write(f)
rotate_pages('scanned.pdf', 'rotated.pdf', 90, 3) # 旋转第3页90度9、提取PDF文本 PyPDF2 快速提取可读文本:
from PyPDF2 import PdfReader
def extract_text(pdf_path):
reader = PdfReader(pdf_path)
return ''.join([page.extract_text() for page in reader.pages])
text = extract_text('report.pdf')
10、提取复杂布局文本(PDFMiner) 处理表格、多栏排版等复杂结构:
from pdfminer.high_level import extract_text
text = extract_text('complex_doc.pdf') # 保留布局信息11、提取PDF中的图像 保存嵌入的图片资源:
import fitz
def extract_images(pdf_path):
doc = fitz.open(pdf_path)
for page_num in range(len(doc)):
page = doc.load_page(page_num)
for img_index, img in enumerate(page.get_images()):
xref = img[0]
base_image = doc.extract_image(xref)
with open(f"page{page_num}_img{img_index}.png", "wb") as f:
f.write(base_image["image"])
extract_images('catalog.pdf')12、PDF转图像(每页保存为图片) 用于OCR预处理或生成缩略图:
from pdf2image import convert_from_path
images = convert_from_path('presentation.pdf', dpi=200)
for i, img in enumerate(images):
img.save(f'page_{i}.jpg', 'JPEG') # 输出为JPG13、HTML转PDF 将网页/模板转为高保真PDF:
from weasyprint import HTML
HTML(' https://example.com ').write_pdf('page.pdf') # 网页转PDF
HTML(string='<h1>Hello PDF</h1>').write_pdf('hello.pdf') # HTML字符串转PDF14、动态生成PDF报告(Jinja2+WeasyPrint) 结合数据与模板生成专业报告:
from jinja2 import Template
from weasyprint import HTML
# 1. 加载HTML模板
with open('template.html') as f:
template = Template(f.read())
# 2. 注入数据(如从数据库获取)
html_content = template.render(title="Sales Report", data=sales_data)
# 3. 输出PDF
HTML(string=html_content).write_pdf('report.pdf', stylesheets=['style.css'])15、添加书签/目录 为长文档创建导航结构:
from PyPDF2 import PdfReader, PdfWriter
def add_bookmark(input_path, output_path, bookmarks):
# bookmarks格式: [('Section 1', 0), ('Section 2', 5)]
reader = PdfReader(input_path)
writer = PdfWriter(reader)
for title, page_num in bookmarks:
writer.add_outline_item(title, page_number=page_num)
with open(output_path, 'wb') as f:
writer.write(f)
add_bookmark('thesis.pdf', 'bookmarked.pdf', [('Abstract', 0), ('Chapter 1', 5)])上述方法覆盖文档批量处理、报告自动化生成、内容分析等场景。优先使用PyPDF2处理基础操作,对复杂需求搭配PDFMiner/WeasyPrint提升效果。合理使用能提升自动化的水平与文档处理效率。
“无他,惟手熟尔”!有需要的用起来。
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!