JavaRush /Курсы /Python SELF /Основы создания PDF с текстом для автоматизации отчетност...

Основы создания PDF с текстом для автоматизации отчетности

Python SELF
44 уровень , 2 лекция
Открыта

1. Основы работы с ReportLab

Работа с Canvas

Основным инструментом для создания PDF-документов в ReportLab является класс 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 поддерживает стандартные шрифты, такие как Helvetica, Times-Roman и Courier.

Python

pdf_file.setFont("Helvetica-Bold", 16)  # Жирный шрифт
pdf_file.drawString(100, height - 50, "Отчет о продажах")  # Заголовок

Изменение цвета текста

ReportLab поддерживает установку цвета текста с помощью метода setFillColorRGB(), который принимает значения RGB от 0 до 1.

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 можно использовать комбинацию статических и динамических данных. Например, заранее подготовленный фон для отчета с фирменными логотипами и постоянными элементами, которые накладываются на динамический контент, формируемый из данных приложения.

Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 64
2 августа 2025
Лекция полная параша. Абсолютно не соответствует заданиям.
Edf Уровень 64
13 марта 2025
CANVAS - НЕ ИМЕЕТ ВСТРОЕННОЙ ПОДДЕРЖКИ КИРИЛЛИЦЫ!!
Slevin Уровень 64
2 августа 2025
Да без шансов, те кто писал эти задачи и лекции - никогда не проверяли результат