1. Основы работы с ReportLab
Работа с Canvas
Основным инструментом для создания PDF-документов в ReportLab является класс 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(), который принимает значения RGB от 0 до 1.
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 можно использовать комбинацию статических и динамических данных. Например, заранее подготовленный фон для отчета с фирменными логотипами и постоянными элементами, которые накладываются на динамический контент, формируемый из данных приложения.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ