PDF 自动化:PyPDF2 与 ReportLab 处理 PDF 文档

好嘞,各位观众老爷们!今天咱们聊点高大上的,但保证你听得懂、学得会,甚至还能乐出声儿来的东西——PDF自动化!

你是不是也遇到过这种抓狂时刻:

  • 需要批量处理PDF,比如合并、分割、加水印,一个一个手动操作,简直要怀疑人生!🤯
  • 想从PDF里提取信息,却发现复制粘贴的格式乱七八糟,还得手动整理,简直是体力活!😩
  • 想用Python生成精美的PDF报告,但对着各种复杂的库和文档,感觉像在啃砖头!🧱

别担心,今天我就带你飞,用Python的PyPDF2和ReportLab这两个利器,轻松搞定PDF自动化,让你从PDF苦力变成PDF艺术家!😎

第一幕:PyPDF2——PDF界的瑞士军刀

PyPDF2,顾名思义,就是用Python操作PDF的第二代库(虽然它已经存在很久了)。它就像一把瑞士军刀,功能强大,能帮你完成各种PDF操作,比如:

  • 读取PDF信息: 提取PDF的元数据,比如作者、标题、创建时间等等。
  • 分割PDF: 将一个PDF文件分割成多个小文件。
  • 合并PDF: 将多个PDF文件合并成一个大文件。
  • 旋转页面: 将PDF页面旋转指定的角度。
  • 加密和解密PDF: 给PDF设置密码,保护你的隐私。
  • 添加水印: 在PDF页面上添加文字或图片水印。

1.1 安装PyPDF2

首先,你需要安装PyPDF2。打开你的命令行工具,输入以下命令:

pip install PyPDF2

安装成功后,就可以开始你的PDF自动化之旅啦!

1.2 读取PDF信息

我们先来试试读取PDF的信息。假设你有一个名为example.pdf的文件,你可以用以下代码读取它的信息:

import PyPDF2

# 打开PDF文件
with open('example.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)

    # 打印PDF信息
    print(f"文档标题: {reader.metadata.title}")
    print(f"文档作者: {reader.metadata.author}")
    print(f"页数: {len(reader.pages)}")

    # 也可以遍历每一页的内容
    # for page_num in range(len(reader.pages)):
    #     page = reader.pages[page_num]
    #     print(f"第 {page_num+1} 页内容:n{page.extract_text()}")

这段代码首先打开PDF文件,然后创建一个PdfReader对象。通过这个对象,你可以访问PDF的各种信息,比如标题、作者、页数等等。是不是很简单?😊

1.3 分割PDF

有时候,你需要将一个大的PDF文件分割成多个小文件。PyPDF2也能轻松搞定。以下代码可以将example.pdf分割成多个文件,每个文件包含一页:

import PyPDF2

# 打开PDF文件
with open('example.pdf', 'rb') as file:
    reader = PyPDF2.PdfReader(file)

    # 遍历每一页
    for page_num in range(len(reader.pages)):
        page = reader.pages[page_num]

        # 创建一个新的PDF写入器
        writer = PyPDF2.PdfWriter()
        writer.add_page(page)

        # 保存到新的PDF文件
        with open(f'page_{page_num+1}.pdf', 'wb') as output:
            writer.write(output)

print("PDF分割完成!")

这段代码遍历PDF的每一页,然后将每一页保存到一个新的PDF文件中。文件名以page_开头,后面跟着页码。

1.4 合并PDF

合并PDF文件也很简单。以下代码可以将page_1.pdfpage_2.pdf合并成一个名为merged.pdf的文件:

import PyPDF2

# 创建一个PDF写入器
writer = PyPDF2.PdfWriter()

# 打开第一个PDF文件
with open('page_1.pdf', 'rb') as file1:
    reader1 = PyPDF2.PdfReader(file1)
    # 将第一个PDF文件的所有页面添加到写入器
    for page in reader1.pages:
        writer.add_page(page)

# 打开第二个PDF文件
with open('page_2.pdf', 'rb') as file2:
    reader2 = PyPDF2.PdfReader(file2)
    # 将第二个PDF文件的所有页面添加到写入器
    for page in reader2.pages:
        writer.add_page(page)

# 保存到新的PDF文件
with open('merged.pdf', 'wb') as output:
    writer.write(output)

print("PDF合并完成!")

这段代码创建了一个PdfWriter对象,然后将两个PDF文件的所有页面添加到这个对象中,最后将所有页面保存到一个新的PDF文件中。

1.5 添加水印

给PDF添加水印可以保护你的版权,防止别人随意复制你的内容。以下代码可以在example.pdf的每一页上添加一个文字水印:

import PyPDF2

# 创建水印PDF
def create_watermark(text):
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    c = canvas.Canvas("watermark.pdf", pagesize=letter)
    c.saveState()
    c.setFont('Times-Bold', 60)
    c.setFillColorRGB(0.8, 0.8, 0.8)
    c.translate(letter[0]/4, letter[1]/2)
    c.rotate(45)
    c.drawCentredString(0, 0, text)
    c.restoreState()
    c.save()

# 添加水印到PDF
def add_watermark(input_pdf, watermark_pdf, output_pdf):
    watermark_obj = PyPDF2.PdfReader(watermark_pdf)
    watermark_page = watermark_obj.pages[0]

    pdf_reader = PyPDF2.PdfReader(input_pdf)
    pdf_writer = PyPDF2.PdfWriter()

    for page in pdf_reader.pages:
        page.merge_page(watermark_page)
        pdf_writer.add_page(page)

    with open(output_pdf, 'wb') as out_file:
        pdf_writer.write(out_file)

# 使用示例
watermark_text = "CONFIDENTIAL"
create_watermark(watermark_text) # 创建水印PDF
add_watermark('example.pdf', 'watermark.pdf', 'watermarked.pdf') # 添加水印

print("水印添加完成!")

这段代码首先创建一个包含水印的PDF文件,然后将水印添加到原始PDF的每一页上,最后将所有页面保存到一个新的PDF文件中。

表格:PyPDF2 常用功能总结

功能 描述
读取PDF信息 提取PDF的元数据,比如作者、标题、创建时间等等。
分割PDF 将一个PDF文件分割成多个小文件。
合并PDF 将多个PDF文件合并成一个大文件。
旋转页面 将PDF页面旋转指定的角度。
加密和解密PDF 给PDF设置密码,保护你的隐私。
添加水印 在PDF页面上添加文字或图片水印。
提取文本 从PDF页面中提取文本内容。

第二幕:ReportLab——PDF界的艺术家

PyPDF2虽然功能强大,但主要用于处理现有的PDF文件。如果你想用Python 从头开始 创建PDF文件,那就要用到ReportLab了。

ReportLab是一个强大的PDF生成库,它可以让你用Python代码创建各种复杂的PDF文档,比如:

  • 报告: 生成包含文字、图片、表格等元素的报告。
  • 发票: 生成包含详细信息的发票。
  • 图表: 生成各种类型的图表,比如柱状图、饼图、折线图等等。
  • 自定义布局: 完全控制PDF页面的布局,实现各种创意设计。

2.1 安装ReportLab

安装ReportLab也很简单:

pip install reportlab

2.2 创建一个简单的PDF

我们先来创建一个最简单的PDF文件,只包含一行文字:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

# 创建一个Canvas对象
c = canvas.Canvas("hello.pdf", pagesize=letter)

# 设置字体和大小
c.setFont('Helvetica', 14)

# 绘制文字
c.drawString(100, 750, "Hello, ReportLab!")

# 保存PDF文件
c.save()

print("PDF创建完成!")

这段代码首先创建一个Canvas对象,它代表一个PDF画布。然后,设置字体和大小,并在画布上绘制文字。最后,保存PDF文件。

2.3 添加图片

你也可以在PDF文件中添加图片。以下代码可以将一张名为image.png的图片添加到PDF文件中:

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

c = canvas.Canvas("image.pdf", pagesize=letter)

# 绘制图片
c.drawImage('image.png', 100, 500, width=200, height=100)

c.save()

print("PDF创建完成!")

这段代码使用drawImage方法在画布上绘制图片。你可以指定图片的位置、宽度和高度。

2.4 创建表格

ReportLab还提供了创建表格的功能。以下代码可以创建一个简单的表格:

from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors

# 数据
data = [
    ['姓名', '年龄', '城市'],
    ['张三', '25', '北京'],
    ['李四', '30', '上海'],
    ['王五', '28', '广州']
]

# 创建表格对象
table = Table(data)

# 设置表格样式
style = TableStyle([
    ('BACKGROUND', (0, 0), (-1, 0), colors.grey),
    ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
    ('ALIGN', (0, 0), (-1, -1), 'CENTER'),
    ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
    ('BOTTOMPADDING', (0, 0), (-1, 0), 12),
    ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
    ('GRID', (0, 0), (-1, -1), 1, colors.black)
])
table.setStyle(style)

# 创建文档对象
doc = SimpleDocTemplate("table.pdf")

# 构建文档
doc.build([table])

print("PDF创建完成!")

这段代码首先定义了表格的数据,然后创建了一个Table对象。接着,设置表格的样式,比如背景颜色、字体、对齐方式等等。最后,创建一个SimpleDocTemplate对象,并将表格添加到文档中。

表格:ReportLab 常用功能总结

功能 描述
创建Canvas 创建一个PDF画布,用于绘制各种元素。
绘制文字 在画布上绘制文字。
绘制图片 在画布上绘制图片。
创建表格 创建各种样式的表格。
自定义布局 完全控制PDF页面的布局,实现各种创意设计。
生成图表 生成各种类型的图表,比如柱状图、饼图、折线图等等。

第三幕:PyPDF2 + ReportLab——PDF自动化的终极组合

PyPDF2和ReportLab可以结合使用,实现更强大的PDF自动化功能。比如,你可以用ReportLab生成一个包含图表的PDF文件,然后用PyPDF2给这个文件添加水印。

案例:生成带水印的图表报告

# 1. 使用ReportLab生成包含图表的PDF文件
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter
from reportlab.graphics.shapes import Drawing
from reportlab.graphics.charts.barcharts import VerticalBarChart

def create_chart_pdf(filename):
    c = canvas.Canvas(filename, pagesize=letter)
    d = Drawing(400, 200)

    bc = VerticalBarChart()
    bc.x = 50
    bc.y = 50
    bc.height = 125
    bc.width = 300
    bc.data = [(13, 5, 20, 22, 37, 45, 19, 4)]
    bc.strokeColor = colors.black

    d.add(bc)
    c.translate(100, 600)
    d.drawOn(c, 0, 0)

    c.save()

# 2. 使用PyPDF2添加水印
import PyPDF2

# 创建水印PDF
def create_watermark(text):
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    c = canvas.Canvas("watermark.pdf", pagesize=letter)
    c.saveState()
    c.setFont('Times-Bold', 60)
    c.setFillColorRGB(0.8, 0.8, 0.8)
    c.translate(letter[0]/4, letter[1]/2)
    c.rotate(45)
    c.drawCentredString(0, 0, text)
    c.restoreState()
    c.save()

# 添加水印到PDF
def add_watermark(input_pdf, watermark_pdf, output_pdf):
    watermark_obj = PyPDF2.PdfReader(watermark_pdf)
    watermark_page = watermark_obj.pages[0]

    pdf_reader = PyPDF2.PdfReader(input_pdf)
    pdf_writer = PyPDF2.PdfWriter()

    for page in pdf_reader.pages:
        page.merge_page(watermark_page)
        pdf_writer.add_page(page)

    with open(output_pdf, 'wb') as out_file:
        pdf_writer.write(out_file)

# 使用示例
create_chart_pdf("chart.pdf") # 创建包含图表的PDF
watermark_text = "CONFIDENTIAL"
create_watermark(watermark_text) # 创建水印PDF
add_watermark('chart.pdf', 'watermark.pdf', 'report_with_watermark.pdf') # 添加水印

print("PDF创建完成!")

这个案例首先使用ReportLab生成一个包含柱状图的PDF文件,然后使用PyPDF2给这个文件添加了CONFIDENTIAL的水印。

总结

今天我们一起学习了如何使用PyPDF2和ReportLab进行PDF自动化。PyPDF2就像一把瑞士军刀,可以处理现有的PDF文件;ReportLab就像一位艺术家,可以从头开始创作PDF文件。将它们结合使用,你可以轻松搞定各种PDF自动化任务,从PDF苦力变成PDF艺术家!🎉

希望这篇文章能帮助你更好地理解PDF自动化,并在实际工作中应用这些技术。记住,编程的乐趣在于不断学习和尝试,祝你在PDF自动化的道路上越走越远!🚀

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注