JavaRush /Курсы /Python SELF /Стилизация текста и заголовков в PDF-документы с помощью ...

Стилизация текста и заголовков в PDF-документы с помощью ReportLab

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

1. Основы добавления текста и заголовков в PDF

В ReportLab текст добавляется с помощью объекта canvas, который предоставляет методы для задания шрифтов, цветов, размеров и позиций текста.

Создание простого PDF с заголовком и текстом

Python

from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4

# Создаем новый PDF
pdf_file = canvas.Canvas("styled_text.pdf", pagesize=A4)
width, height = A4

# Добавляем заголовок
pdf_file.setFont("Helvetica-Bold", 20)
pdf_file.drawString(100, height - 100, "Отчет по продажам")

# Добавляем основной текст
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 130, "Этот документ содержит информацию о продажах за последний квартал.")

# Сохранение PDF
pdf_file.save()

Этот код создает PDF-файл, содержащий заголовок и основной текст. Мы задаем шрифт и размер текста с помощью метода setFont().

2. Стилизация и форматирование текста

В ReportLab можно изменять цвет, шрифт и размер текста, создавая стильные заголовки и основное содержимое. Это помогает структурировать документ и делает его более удобным для чтения.

Изменение шрифта и размера текста

ReportLab поддерживает стандартные шрифты, такие как Helvetica, Times-Roman и Courier. Вы можете указать стиль шрифта (обычный, жирный или курсив) и размер, используя setFont().

Python

pdf_file.setFont("Helvetica-Bold", 18)  # Заголовок в жирном шрифте
pdf_file.drawString(100, height - 50, "Главный заголовок")

pdf_file.setFont("Helvetica-Oblique", 14)  # Подзаголовок курсивом
pdf_file.drawString(100, height - 80, "Подзаголовок: Итоги квартала")

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

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

Python

pdf_file.setFillColorRGB(0.2, 0.4, 0.6)  # Синий цвет
pdf_file.setFont("Helvetica", 12)
pdf_file.drawString(100, height - 110, "Этот текст имеет синий цвет.")

Можно также использовать предопределенные цвета из reportlab.lib.colors.

Python

from reportlab.lib import colors

pdf_file.setFillColor(colors.red)
pdf_file.drawString(100, height - 140, "Красный текст")

3. Выравнивание и многострочный текст

Если текст длинный, его лучше представить в многострочном формате. ReportLab предоставляет класс TextObject, который поддерживает автоматический перенос строк.

Многострочный текст с TextObject

Python

text = """
Отчет содержит анализ продаж за последние три месяца.
Мы рассматриваем изменения и их влияние на общий рост компании.
"""

text_object = pdf_file.beginText(100, height - 180)
text_object.setFont("Helvetica", 12)
text_object.setFillColor(colors.darkblue)

for line in text.split("\n"):
    text_object.textLine(line)

pdf_file.drawText(text_object)

Этот код создает текстовый блок с несколькими строками, каждая из которых добавляется в PDF. Использование TextObject удобно для длинного текста, так как обеспечивает автоформатирование.

4. Использование абзацев для стилизации текста

Класс Paragraph из модуля reportlab.platypus позволяет добавлять стилизованный текст с поддержкой HTML-тегов, таких как <b>, <i> и <u>. Paragraph также поддерживает выравнивание и отступы, что делает его идеальным для создания форматированного текста.

Создание абзацев с Paragraph

Python

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph

# Настройка PDF
doc = SimpleDocTemplate("styled_paragraphs.pdf", pagesize=A4)
styles = getSampleStyleSheet()
elements = []

# Создание абзаца с жирным и курсивным текстом
text = "Отчет по продажам
Квартальный отчет 2023 года" paragraph = Paragraph(text, styles["Title"]) elements.append(paragraph) # Добавление основного текста main_text = """ Этот отчет содержит ключевые данные о продажах за последний квартал, а также анализ влияния продаж на общий доход компании. """ paragraph = Paragraph(main_text, styles["BodyText"]) elements.append(paragraph) # Построение PDF doc.build(elements)

Здесь мы используем Paragraph для добавления форматированного текста, который включает HTML-теги для стилизации (жирный и курсивный текст). getSampleStyleSheet() предоставляет базовые стили, такие как Title и BodyText, которые можно изменять.

5. Применение стилей текста

ReportLab позволяет создавать и настраивать собственные стили, которые можно использовать для форматирования текста. Это особенно полезно при создании отчетов, где используются повторяющиеся стили для заголовков, подзаголовков и основного текста.

Настройка пользовательского стиля

Python

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph

# Настройка PDF
doc = SimpleDocTemplate("custom_styles.pdf", pagesize=A4)
elements = []

# Создание пользовательского стиля
custom_style = ParagraphStyle(
    name="CustomStyle",
    fontName="Helvetica-Bold",
    fontSize=14,
    leading=18,
    textColor=colors.darkgreen,
    spaceAfter=10,
)

# Создание абзаца с пользовательским стилем
paragraph = Paragraph("Это заголовок с пользовательским стилем", custom_style)
elements.append(paragraph)

# Добавление основного текста
default_style = ParagraphStyle(
    name="Default",
    fontName="Helvetica",
    fontSize=12,
    leading=14,
    textColor=colors.black,
    spaceAfter=10,
)
paragraph = Paragraph("Это основной текст с использованием стандартного стиля.", default_style)
elements.append(paragraph)

# Построение PDF
doc.build(elements)

В этом примере мы создаем пользовательский стиль CustomStyle с зеленым цветом текста и более крупным шрифтом, который применяем к заголовку.

6. Создание документа с заголовками и текстом

Чтобы PDF-документ был более структурированным, можно создать многостраничный отчет с разделами, каждый из которых имеет свой заголовок и стилизованный текст.

Создание структурированного многостраничного отчета

Python

from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import SimpleDocTemplate, Paragraph, PageBreak

# Настройка PDF
doc = SimpleDocTemplate("structured_report.pdf", pagesize=A4)
styles = getSampleStyleSheet()
elements = []

# Стиль для заголовка
title_style = ParagraphStyle("TitleStyle", parent=styles["Title"], fontSize=18, spaceAfter=12)

# Заголовок первой страницы
title = Paragraph("Отчет о продажах за 2023 год", title_style)
elements.append(title)

# Основной текст
main_text = """
Этот отчет предоставляет детальную информацию о продажах компании за первый квартал 2023 года.
Включены данные по регионам, категориям продуктов и ключевым показателям.
"""
elements.append(Paragraph(main_text, styles["BodyText"]))

# Переход на новую страницу
elements.append(PageBreak())

# Заголовок второй страницы
subtitle = Paragraph("Анализ продаж по категориям", title_style)
elements.append(subtitle)

# Текст для второй страницы
category_text = """
На второй странице представлены данные о продажах по категориям продуктов.
Каждая категория проанализирована с учетом динамики продаж и изменений на рынке.
"""
elements.append(Paragraph(category_text, styles["BodyText"]))

7. Тонкости форматирования текста

Выбор шрифтов и их размеров

Мир PDF — это не только обезличенные документы, но и возможность выразить себя в тексте. Хотя reportlab поддерживает множество опций для настройки шрифтов и стилей, важно помнить о некоторых ограничениях. Например, некоторые шрифты могут не поддерживаться, особенно если у вас нет их лицензионных копий.

Для настройки шрифта мы использовали метод setFont, который принимает название шрифта и его размер:

Python

c.setFont("Times-Roman", 12)

Стилизация заголовков

Возможно, вам захочется выделить заголовки и сделать их более заметными. Это можно сделать, увеличив размер шрифта или сделав его полужирным. Обратите внимание, как мы использовали Helvetica-Bold для заголовков.

Выравнивание текста

В reportlab текст по умолчанию выравнивается по левому краю, но вы можете изменить это, используя методы для вычисления ширины текста и центрирования. Это будет полезно для создания более сложных композиций текста на странице.

8. Реальное применение

Вот несколько сценариев, где добавление текста и заголовков в PDF может быть полезно:

  • Автоматизированные отчёты. Вы можете формировать отчеты с динамическим текстом, извлекаемым из ваших анализов данных.
  • Документы с оглавлением. Добавление заголовков и подзаголовков упрощает навигацию по документам, особенно большим.
  • Персонализированные документы. Если ваш проект требует создавать индивидуализированные документы для участников, например, сертификаты или приглашения, автоматизация текста в PDF будет крайне полезной.

Типичные ошибки

Иногда при создании PDF вы можете столкнуться с проблемами. Частой ошибкой является использование неподдерживаемых шрифтов или неправильное размещение текста из-за неучтенных размеров страницы. Протестируйте ваш скрипт на нескольких примерах, чтобы убедиться, что текст выводится корректно на всех платформах и устройствах.

Для получения дополнительной информации и более сложных примеров, обратитесь к документации ReportLab и PyPDF2 GitHub, где вы найдете множество примеров и советов по использованию.

Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 2
2 августа 2025
Это лекция к заданиям из прошлой лекции