1. Những điều cơ bản về ReportLab
Làm việc với Canvas
Công cụ chính để tạo tài liệu PDF trong ReportLab là lớp canvas. Nó cung cấp các phương thức để thêm văn bản, đường kẻ, hình chữ nhật và các yếu tố đồ họa khác.
Tạo tệp PDF cơ bản với văn bản
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Tạo tệp PDF mới
pdf_file = canvas.Canvas("basic_report.pdf", pagesize=A4)
width, height = A4
# Thêm văn bản
pdf_file.setFont("Helvetica", 12) # Cài đặt font và kích cỡ
pdf_file.drawString(100, height - 100, "Xin chào! Đây là báo cáo được tạo bằng ReportLab.")
# Lưu và đóng file PDF
pdf_file.save()
Trong ví dụ này, một tệp PDF cơ bản được tạo với văn bản "Xin chào! Đây là báo cáo được tạo bằng ReportLab." trên trang đầu tiên.
2. Thêm văn bản vào PDF
ReportLab cho phép tùy chỉnh văn bản linh hoạt, bao gồm kích thước, font và màu sắc. Điều này quan trọng trong việc tạo báo cáo có cấu trúc, vì tiêu đề, phụ đề và văn bản chính có thể được hiển thị khác nhau.
Cài đặt font và kích thước văn bản
Sử dụng phương thức setFont() để đặt font và kích thước văn bản. ReportLab hỗ trợ các font chuẩn như Helvetica, Times-Roman và Courier.
pdf_file.setFont("Helvetica-Bold", 16) # Font đậm
pdf_file.drawString(100, height - 50, "Báo cáo doanh thu") # Tiêu đề
Thay đổi màu văn bản
ReportLab hỗ trợ cài đặt màu văn bản bằng phương thức setFillColorRGB(), nhận các giá trị RGB từ 0 đến 1.
pdf_file.setFillColorRGB(0, 0, 1) # Màu xanh dương
pdf_file.drawString(100, height - 150, "Đoạn văn bản này có màu xanh dương.")
3. Làm việc với các khối văn bản và văn bản nhiều dòng
Nếu văn bản dài, bạn có thể định dạng nó thành một khối bằng cách sử dụng drawString() và chỉ định tọa độ cho từng dòng. Tuy nhiên, để tự động ngắt dòng văn bản, sử dụng drawText() và TextObject tiện hơn.
Thêm văn bản nhiều dòng với TextObject
text = """
Báo cáo doanh thu năm 2023.
Báo cáo này chứa thông tin chi tiết về doanh thu, phân tích dữ liệu và dự báo.
"""
# Tạo đối tượng văn bản
text_object = pdf_file.beginText(100, height - 200)
text_object.setFont("Helvetica", 12)
text_object.setFillColorRGB(0, 0, 0)
# Thêm văn bản
for line in text.split("\n"):
text_object.textLine(line)
pdf_file.drawText(text_object)
Trong ví dụ này, một đối tượng văn bản TextObject được tạo để tự động ngắt dòng từng dòng văn bản.
4. Tạo báo cáo nhiều trang
Báo cáo nhiều trang cho phép hiển thị nhiều dữ liệu hơn và tạo cấu trúc tài liệu dễ đọc. Trong ReportLab, để chuyển sang trang mới, sử dụng phương thức showPage().
Tạo một tệp PDF nhiều trang
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
# Tạo PDF
pdf_file = canvas.Canvas("multi_page_report.pdf", pagesize=A4)
width, height = A4
# Trang 1
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Trang 1: Giới thiệu")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Đây là trang đầu tiên của báo cáo.")
pdf_file.showPage() # Chuyển sang trang mới
# Trang 2
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Trang 2: Dữ liệu")
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Đây là trang thứ hai của báo cáo.")
# Lưu và đóng PDF
pdf_file.save()
Trong ví dụ này, một tệp PDF được tạo với hai trang, mỗi trang có tiêu đề và văn bản riêng. Phương thức showPage() kết thúc trang hiện tại và bắt đầu trang mới.
5. Thêm dữ liệu động vào PDF
Để tự động hóa báo cáo, ReportLab cho phép thêm dữ liệu động, ví dụ, từ danh sách hoặc dictionary. Điều này hữu ích để tạo báo cáo có bảng hoặc danh sách dữ liệu có thể được cập nhật thường xuyên.
Thêm dữ liệu từ danh sách
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
data = [
{"Tháng": "Tháng 1", "Doanh thu": 200},
{"Tháng": "Tháng 2", "Doanh thu": 300},
{"Tháng": "Tháng 3", "Doanh thu": 250},
]
pdf_file = canvas.Canvas("sales_report.pdf", pagesize=A4)
width, height = A4
# Tiêu đề
pdf_file.setFont("Helvetica-Bold", 16)
pdf_file.drawString(100, height - 100, "Báo cáo doanh thu")
# Thêm dữ liệu
pdf_file.setFont("Helvetica", 12)
y_position = height - 150
for item in data:
line = f"{item['Tháng']}: Doanh thu = {item['Doanh thu']}"
pdf_file.drawString(100, y_position, line)
y_position -= 20
# Lưu PDF
pdf_file.save()
Mã này tạo một tệp PDF, thêm dữ liệu doanh thu cho mỗi tháng thành các dòng riêng biệt.
6. Thêm hình ảnh
Bên cạnh văn bản, tài liệu PDF có thể chứa hình ảnh và đồ thị. Hãy thử thêm một hình ảnh:
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, "Đây là nơi hình ảnh của bạn sẽ xuất hiện:")
# Đường dẫn đến hình ảnh của bạn
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)
Thật dễ dàng phải không? Bây giờ chúng ta đã có một PDF với hình ảnh!
GO TO FULL VERSION