1. 使用ReportLab的基礎
使用Canvas
在ReportLab中用於生成PDF文件的主要工具是canvas類。它提供了添加文字、直線、矩形和其他圖形元素的方法。
生成簡單的帶有文字的PDF檔案
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支持的標準字體包括Helvetica、Times-Roman和Courier。
pdf_file.setFont("Helvetica-Bold", 16) # 粗體字
pdf_file.drawString(100, height - 50, "銷售報告") # 標題
更改文字顏色
ReportLab支持通過setFillColorRGB()方法來設置文字的顏色,此方法接受從0到1的RGB值。
pdf_file.setFillColorRGB(0, 0, 1) # 藍色
pdf_file.drawString(100, height - 150, "這段文字是藍色的。")
3. 處理文字塊和多行文字
如果文字較長,可以使用drawString()設置每行文字的座標來格式化為文字塊。然而,對於自動換行文字,使用drawText()和TextObject更為方便。
使用TextObject添加多行文字
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文件
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允許從列表或字典中動態添加數據。這對於生成帶有表格或數據列表的報表非常有用,特別是當數據需要定期更新時。
從列表中添加數據
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文檔中還可以添加圖片和圖表。我們來試着添加圖片:
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中添加表格
現在我們從簡單文字稍作偏移。如果我們需要添加數據,例如商品列表及其價格呢?讓我們舉一個非常簡單的例子:
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創建模板可以結合靜態和動態數據。例如,為報告提前準備帶有公司標誌和固定元素的背景,然後將應用程序生成的動態內容疊加上去。
GO TO FULL VERSION