CodeGym /課程 /Python SELF TW /使用文字建立PDF的基礎,幫助自動化報表

使用文字建立PDF的基礎,幫助自動化報表

Python SELF TW
等級 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