CodeGym /Java 课程 /Python SELF ZH /为自动化报表创建带文本的PDF基础

为自动化报表创建带文本的PDF基础

Python SELF ZH
第 44 级 , 课程 2
可用

1. 使用ReportLab的基础

与Canvas工具一起工作

在ReportLab中创建PDF文档的主要工具是canvas类。它提供了添加文本、线条、矩形以及其他图形元素的方法。

创建一个简单的带文本的PDF文件

Python

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

# 创建一个新的PDF文件
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4

# 添加文本
pdf_file.setFont("Helvetica", 12)  # 设置字体和大小
pdf_file.drawString(100, height - 100, "你好!这是用ReportLab创建的报告。")

# 保存并关闭PDF
pdf_file.save()

在这个例子中,创建了一个简单的PDF文件,在第一页显示文本"你好!这是用ReportLab创建的报告"。

2. 向PDF中添加文本

ReportLab允许灵活设置文本,包括大小、字体和颜色。这对于创建结构化报告非常重要,因为标题、副标题和正文可能看起来不同。

设置文本的字体和大小

使用setFont()方法来设置文本的字体和大小。ReportLab支持标准字体,例如HelveticaTimes-RomanCourier

Python

pdf_file.setFont("Helvetica-Bold", 16)  # 粗体字体
pdf_file.drawString(100, height - 50, "销售报告")  # 标题

更改文本颜色

ReportLab支持使用setFillColorRGB()方法设置文本颜色,该方法接受从0到1的RGB值。

Python

pdf_file.setFillColorRGB(0, 0, 1)  # 蓝色
pdf_file.drawString(100, height - 150, "这个文本是蓝色的。")

3. 使用文本块和多行文本

如果文本较长,可以通过drawString()方法设置每行的坐标将其格式化为块状文本。然而,为了自动换行,更方便的做法是使用drawText()TextObject

使用TextObject添加多行文本

Python

text = """
2023年销售报告。
该报告包含销售的详细信息、数据分析和预测。
"""

# 创建文本对象
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)

# 添加文本
for line in text.split("\n"):
    text_object.textLine(line)

pdf_file.drawText(text_object)

在这个示例中,创建了一个TextObject文本对象,它会自动换行显示每一行文本。

4. 创建多页报告

多页报告允许显示更多数据并创建易于阅读的文档结构。在ReportLab中,可以通过showPage()方法跳转到新页面。

创建多页PDF文件

Python

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

# 创建PDF
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4

# 第1页
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "第1页: 介绍")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "这是报告的第一页。")
pdf_file.showPage()  # 跳转到新页面

# 第2页
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "第2页: 数据")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "这是报告的第二页。")

# 保存并关闭PDF
pdf_file.save()

在这个示例中,创建了一个带有两页的PDF,每页都有自己的标题和文本。showPage()方法结束当前页并开始新页。

5. 在PDF中添加动态数据

为了自动化报表,ReportLab允许动态添加数据,例如从列表或字典中获取数据。这对于创建包含表格或可定期更新数据的报告非常有用。

从列表中添加数据

Python

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

data = [
    {"月份": "一月", "销售": 200},
    {"月份": "二月", "销售": 300},
    {"月份": "三月", "销售": 250},
]

pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4

# 标题
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "销售报告")

# 添加数据
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
    line = f"{item['月份']}: 销售 = {item['销售']}"
    pdf_file.drawString(100, y_position, line)
    y_position -= 20

# 保存PDF
pdf_file.save()

这段代码创建了一个PDF文件,为每个月的销售数据添加到单独的行中。

6. 添加图片

除了文本,PDF文档中还可以包含图片和图表。让我们尝试添加一张图片:

Python

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

def create_pdf_with_image(file_path):
    c = canvas.Canvas(file_path, pagesize=letter)
    width, height = letter

    c.drawString(100, height - 100, "你的图片将在这里:")
    # 图片路径
    image_path = "example_image.jpg"
    c.drawImage(image_path, 100, height - 300, width=200, height=150)

    c.showPage()
    c.save()

file_path = "image_example.pdf"
create_pdf_with_image(file_path)

是不是很简单?现在我们有一个带图片的PDF文件了!

现在你已经知道了如何创建带文本和图片的PDF文档,让我们想想如何在现实生活中应用这些知识。假如你在一家分析公司工作,每个月都要创建销售报告。与其每次手动准备文档,还不如写个脚本,自动收集数据并生成PDF报告。这不仅能节省你的时间,而且还能提高报告数据的准确性和一致性。

7. 在PDF中添加表格

接下来,让我们稍微远离单纯的文本。如果我们想添加数据,比如商品清单和它们的价格呢?我们来看一个简单的例子:

Python

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

items = [("熨斗", 42.99), ("水壶", 15.00), ("电视", 250.00)]

def create_pdf_with_table(file_path):
    c = canvas.Canvas(file_path, pagesize=letter)
    width, height = letter

    c.drawString(100, height - 100, "商品清单及其价格:")
    
    y = height - 150
    for item in items:
        c.drawString(100, y, f"{item[0]} - {item[1]:.2f} $")
        y -= 20

    c.showPage()
    c.save()

file_path = "table_example.pdf"
create_pdf_with_table(file_path)

这里我们添加了一个简单的商品清单以及它们的价格。想象一下的可能性:可以从数据库中获取数据,甚至是你最爱的pandas DataFrame,来创建更复杂的表格!

8. 使用模板来自动化报告

自动化报告的最强大方法之一是使用模板。基本思路是创建带有结构和设计的文档模板,然后用脚本填充数据。

创建模板文档

创建一个包括静态元素,比如徽标和固定标题的基本模板。然后自动填充动态数据,比如日期、图表或列表。可以通过Jinja2生成模板文本,然后生成最终的PDF。

使用ReportLab创建模板时,可以将静态数据和动态数据结合起来。例如,提前准备好带有公司徽标和固定元素的背景,再将动态内容覆盖上去,形成最终的报告。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION