首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Python 自动化操作PDF

Python 自动化操作PDF

作者头像
用户11081884
发布2026-07-20 16:52:32
发布2026-07-20 16:52:32
170
举报

Python自动化操作PDF主要使用PyPDF2、ReportLab、PDFMiner等主流库,涵盖文本提取、文档生成、页面操作和格式转换等高频需求,合理使用能提升自动化的水平与文档处理效率。

1、合并多个PDF文件 使用PdfMerger高效合并文档,支持批量处理:

代码语言:javascript
复制
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和doc2

2、拆分PDF文件 按页码范围提取特定页面:

代码语言:javascript
复制
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加密保护:

代码语言:javascript
复制
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文件 解除文件访问限制:

代码语言:javascript
复制
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动态插入文字(如签名、批注):

代码语言:javascript
复制
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作为水印嵌入:

代码语言:javascript
复制
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、删除指定页面 清理不需要的页面:

代码语言:javascript
复制
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、旋转页面 调整扫描文档方向:

代码语言:javascript
复制
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 快速提取可读文本:

代码语言:javascript
复制
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) 处理表格、多栏排版等复杂结构:

代码语言:javascript
复制
from pdfminer.high_level import extract_text
text = extract_text('complex_doc.pdf')  # 保留布局信息

11、提取PDF中的图像 保存嵌入的图片资源:

代码语言:javascript
复制
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预处理或生成缩略图:

代码语言:javascript
复制
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')  # 输出为JPG

13、HTML转PDF 将网页/模板转为高保真PDF

代码语言:javascript
复制
from weasyprint import HTML
HTML(' https://example.com ').write_pdf('page.pdf')  # 网页转PDF
HTML(string='<h1>Hello PDF</h1>').write_pdf('hello.pdf')  # HTML字符串转PDF

14、动态生成PDF报告(Jinja2+WeasyPrint) 结合数据与模板生成专业报告:

代码语言:javascript
复制
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、添加书签/目录 为长文档创建导航结构:

代码语言:javascript
复制
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提升效果。合理使用能提升自动化的水平与文档处理效率。

“无他,惟手熟尔”!有需要的用起来。

如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-07-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Nicholas与Pypi 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档