Сообщить об ошибке.

TTF-шрифты и стилизация текста создаваемого PDF-документа

В материале представлены примеры, а так же описываются методы, позволяющие управлять стилем выводимого текста в создаваемом PDF-документе, а именно задавать и изменять шрифт, стиль, размер и цвет текста по ходу его вывода.

Содержание:


Добавление TTF-шрифтов для использования в PDF.

Модуль fpdf2 поддерживает установку акцента на тексте: полужирный, курсив или подчеркнутый.

Полужирный и курсивный шрифт требует использования отдельных шрифтов для каждого стиля.

Для стандартных шрифтов ('Courier', 'Helvetica' и 'Times', не поддерживают кириллицу), эти стили настроены по умолчанию. Использование других шрифтов (например, поддерживающих utf8) означает, что их варианты (полужирный, курсив и жирный курсив) должны быть зарегистрированы с помощью метода FPDF.add_font() с указанием аргумента style = 'B' или style = 'I' или style = 'BI'.

Бесплатные TTF-шрифты, которые поддерживают кодировку utf8, и следовательно кириллицу, можно получить в https://fonts.google.com/. Для русского языка, а так же большинства западных языков рекомендуем набор шрифтов NotoSans. Конечно можно использовать и другие шрифты.

Пример добавления шрифтов, поддерживающие кириллицу:

pdf = fpdf.FPDF()
# подключаем шрифт NotoSans-Regular.ttf и даем ему имя "Sans"
pdf.add_font("Sans", style="", fname="Noto_Sans/NotoSans-Regular.ttf", uni=True)
# подключаем жирный шрифт "Sans"
pdf.add_font("Sans", style="B", fname="Noto_Sans/NotoSans-Bold.ttf", uni=True)
# подключаем наклонный шрифт "Sans"
pdf.add_font("Sans", style="I", fname="Noto_Sans/NotoSans-Italic.ttf", uni=True)
# подключаем жирный-наклонный шрифт "Sans"
pdf.add_font("Sans", style="BI", fname="Noto_Sans/NotoSans-BoldItalic.ttf", uni=True)

Справочная информация по методу FPDF.add_font().

FPDF.add_font(family, style='', fname=None, uni=False):

Метод FPDF.add_font() импортирует шрифт TrueType и OpenType и делает его доступным для последующих вызовов метода FPDF.set_font().

Принимаемые аргументы:

  • family : строка, определяющее локальное название шрифта. Используется как ссылка для FPDF.set_font().
  • style='': стиль шрифта. Принимает 'B' для жирного шрифта, 'I' для курсива и 'BI' для жирного курсива.font style. "B" for bold, "I" for italic.
  • fname=None: строка, относительный или полный путь к файлу шрифта. Если файл не найден, то он будет искаться по пути, заданным в константе fpdf.FPDF_FONT_DIR.
  • uni=False: если установлено значение True, то включается встраивание подмножества шрифтов TrueType. После этого текст по умолчанию будет обрабатываться как utf8. Вызов этого метода с uni=False не рекомендуется, поскольку поддержка устаревших шрифтов сложна и устарела.

Примечание: Так как обработка шрифтов может занимать много времени, некоторые данные кэшируются. По умолчанию файлы кэша создаются в текущей папке. Этим можно управлять с помощью аргумента font_cache_dir конструктора FPDF().

Установка и изменение шрифта, его стиля и размера.

Установить шрифт по умолчанию для всего создаваемого PDF-документа можно методом FPDF.set_font(), этот метод так же пригодится, что бы менять стиль/акцент на тексте, а так же его размер. Это делается с помощью аргументов метода style и size.

Для изменения размера текста, так же есть отдельный метод FPDF.set_font_size(size). Он принимает единственный аргумент size, который настраивает размер шрифта в пунктах.

Включить подчеркивание текста так же можно передав значение True в свойство экземпляра FPDF.underline = True. Для отключения подчеркивания, необходимо передать FPDF.underline = False.

from fpdf import FPDF

pdf = FPDF(font_cache_dir=None)
# подключаем шрифт NotoSans-Regular.ttf и даем ему имя "Sans"
pdf.add_font("Sans", style="", fname="Noto_Sans/NotoSans-Regular.ttf", uni=True)
# подключаем жирный шрифт "Sans"
pdf.add_font("Sans", style="B", fname="Noto_Sans/NotoSans-Bold.ttf", uni=True)
# подключаем наклонный шрифт "Sans"
pdf.add_font("Sans", style="I", fname="Noto_Sans/NotoSans-Italic.ttf", uni=True)
pdf.set_font("Sans", size=23)
pdf.add_page()
pdf.write(txt="Добро ")
# включаем жирный 
pdf.set_font(style="B")
pdf.write(txt="пожаловать ")
# здесь отключили стиль
pdf.set_font(style="")
pdf.write(txt="в ")
# курсив
pdf.set_font(style="I")
pdf.write(txt="великолепный ")
# подчеркнутый курсив
pdf.set_font(style="IU")
pdf.write(txt="Python.")
# отключаем стиль
pdf.set_font(style="", size=18)
# перевод строки с отступом 20 мм
pdf.ln(20)
# альтернативное включение подчеркивания
pdf.underline = True
pdf.write(txt="Альтернативное подчеркивание текста.")
# отключаем подчеркивание
pdf.underline = False
# перевод строки
pdf.ln(7)
pdf.write(txt="Этот текст уже не подчеркнут.")
pdf.output("style.pdf")

Справочная информация по .set_font() и .set_stretching().

FPDF.set_font(family=None, style='', size=0):

Метод FPDF.set_font() устанавливает шрифт, и использует его для вывода строк в PDF-документ. Перед выводом текста необходимо обязательно вызвать этот метод хотя бы один раз.

Важно! Модуль fpdf2 не принимает и не устанавливает кодировку текста по умолчанию. Все методы печати/вывода текста в создаваемый PDF-документ принимают только utf-8 для подключаемых шрифтов FPDF.add_font() и однобайтовую кодировку Latin-1 для встроенных шрифтов.

Указанный шрифт методом FPDF.set_font() сохраняется от страницы к странице. Метод можно вызвать до создания первой страницы.

FPDF.set_stretching(stretching):

Метод FPDF.set_stretching() устанавливает горизонтальное растяжение шрифта. По умолчанию растяжение не установлено (что эквивалентно значению 100).

Аргумент stretching - это целое число, означающее горизонтальное растяжение (масштабирование) в процентах.

Цвет текста, выделение текста цветом.

Цвет текста можно определить с помощью метода FPDF.set_text_color() перед его выводом FPDF.write() в создаваемый PDF-документ.

Выделить текст цветом, можно при помощи 2-х методов:

  • сначала задается цвет заливки методом FPDF.set_fill_color;
  • затем фрагмент выделяемого текста выводится методом FPDF.cell() с указанием аргумента fill=True;

Смотрим пример:

from fpdf import FPDF

pdf = FPDF(font_cache_dir=None)
# подключаем шрифт NotoSans-Regular.ttf и даем ему имя "Sans"
pdf.add_font("Sans", style="", fname="Noto_Sans/NotoSans-Regular.ttf", uni=True)
# подключаем жирный шрифт "Sans"
pdf.add_font("Sans", style="B", fname="Noto_Sans/NotoSans-Bold.ttf", uni=True)
# подключаем наклонный шрифт "Sans"
pdf.add_font("Sans", style="I", fname="Noto_Sans/NotoSans-Italic.ttf", uni=True)
pdf.set_font("Sans", size=23)
pdf.add_page()
# задаем стиль текста
pdf.set_font(style="B")
pdf.write(txt="Текст ")
# задаем цвет текста
pdf.set_text_color(255, 0, 0)
pdf.write(txt="красного цвета")
# новая строка
pdf.ln(15)
# отключаем стиль текста
pdf.set_font(style="", size=18)
pdf.write(txt="Цвет задается глобально")
# Для отключения красного цвета
# нужно задать черный цвет 
pdf.set_text_color(0)
# новая строка
pdf.ln(25)
pdf.set_font_size(23)
pdf.write(txt="Теперь выделим текст цветом")
pdf.ln(15)
# цвет заливки - желтый
pdf.set_fill_color(255, 255, 0)
pdf.set_font(style="I", size=18)
pdf.write(txt="Добро ")
# текст для выделения выведем в ячейке
pdf.cell(txt="пожаловать", fill=True)
pdf.write(txt="в Python")
pdf.output("style.pdf")

Справочная информация по методам задания цвета.

FPDF.set_text_color(r, g=-1, b=-1):

Метод FPDF.set_text_color() определяет цвет, используемый для текста.

Цвет может быть указан в компонентах RGB или серой шкале. Метод может быть вызван до создания первой страницы, а значение сохраняется от страницы к странице.

Аргументы:

  • r: если заданы аргументы g и b, то аргумент r указывает на красный компонент RGB. В противном случае r указывает на уровень серого. Значение должно быть от 0 до 255.
  • g: зеленый компонент RGB. Значение должно быть от 0 до 255.
  • b: синий компонент RGB. Значение должно быть от 0 до 255.

Примеры задания цвета:

  • белый FPDF.set_text_color(255, 255, 255);
  • черный FPDF.set_text_color(0, 0, 0);
  • красный FPDF.set_text_color(255, 0, 0);
  • зеленый FPDF.set_text_color(0, 255, 0);
  • синий FPDF.set_text_color(0, 0, 255);
  • желтый FPDF.set_text_color(255, 255, 0);
  • голубой FPDF.set_text_color(0, 255, 255);
  • коричневый FPDF.set_text_color(139, 69, 19);
  • розовый FPDF.set_text_color(255, 193, 193);

FPDF.set_fill_color(r, g=-1, b=-1):

Метод FPDF.set_fill_color() Определяет цвет, используемый для всех операций заливки (закрашенные прямоугольники и фон ячеек). Это может быть выражено в компонентах RGB или серой шкале. Метод может быть вызван до создания первой страницы, и значение сохраняется от страницы к странице.

Аргументы:

  • r: если заданы аргументы g и b, то аргумент r указывает на красный компонент RGB. В противном случае r указывает на уровень серого. Значение должно быть от 0 до 255.
  • g: зеленый компонент RGB. Значение должно быть от 0 до 255.
  • b: синий компонент RGB. Значение должно быть от 0 до 255.

Альтернативные способы стилизации текста.

Модуль fpdf2 поддерживает два альтернативных способа стилизации текста:

  1. методу FPDF.cell() может быть передан необязательный аргумент markdown=True, который включит базовый стиль, подобный Markdown: **bold**, __italics__, --underlined--;
  2. метод FPDF.write_html() позволяет установить акцент на тексте с помощью тегов <b>, <i> и <u>.

Пример с использованием Markdown:

from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font("Times", size=25)
pdf.cell(txt="**Lorem** __Ipsum__ --dolor--", markdown=True)
pdf.output("markdown-styled.pdf")

Пример с использованием FPDF.write_html():

from fpdf import FPDF, HTMLMixin

class HTML_PDF(FPDF, HTMLMixin):
    pass

pdf = HTML_PDF()
pdf.add_page()
pdf.set_font("Times", size=25)
pdf.write_html("""<p><B>bold</B> <I>italic</I> <U>underlined</U></p>
<p><B><I><U>All at once!</U></I></B></p>"""
)
pdf.output("html-styled.pdf")

Описание свойств и методов, связанных с выводом текста в PDF.


FPDF.write(h=None, txt='', link=''):

Метод FPDF.write() печатает текст с текущей позиции. Когда достигается правое поле листа или встречается символ новой строки '\n', то происходит разрыв строки (вызывается метод FPDF.ln()), и текст продолжает выводится с левого поля страницы.

При выходе из метода текущая позиция перемещается в конец текста.

  • h=None: int, высота строки. Значение по умолчанию: None, что означает использование, в качестве высоты, размер текущего шрифта;
  • txt: выводимый текст;
  • link: необязательная ссылка для добавления в текст, внешний URL или внутренний идентификатор, возвращаемый FPDF.add_link().

FPDF.ln(h=None):

Метод FPDF.ln() добавляет перевод строки. Текущая абсцисса FPDF.x возвращается к левому полю, а ордината FPDF.y увеличивается на величину, переданную в качестве аргумента h.

Аргумент h - высота разрыва строки. По умолчанию равно высоте последней выведенной ячейки.

FPDF.get_string_width(s, normalized=False, markdown=False):

Метод FPDF.get_string_width() возвращает длину строки в пользовательских единицах. Перед вызовом этого метода необходимо выбрать шрифт FPDF.set_font(). Значение рассчитывается с учетом растяжения и интервала.

Принимаемые аргументы:

  • s: строка, длина которой должна быть вычислена.
  • normalized=False: необходимо ли выполнять нормализацию входной строки.
  • markdown=False: указывает, включена ли базовая поддержка уценки.

FPDF.font_size:

Свойство FPDF.font_size возвращает текущую высоту шрифта.

FPDF.eph:

Свойство FPDF.eph возвращает эффективную высоту страницы: высота страницы минус ее вертикальные поля.

FPDF.epw:

Свойство FPDF.epw возвращает эффективную ширину страницы: ширина страницы минус ее горизонтальные поля.

FPDF.get_x():

Метод FPDF.get_x() возвращает абсциссу текущей позиции указателя/курсора.

FPDF.get_y():

Метод FPDF.get_y() возвращает ординату текущей позиции указателя/курсора.

FPDF.set_xy(x, y):

Метод FPDF.set_xy задает абсциссу и ординату текущей позиции курсора. Другими словами, перемещает курсор/указатель на указанные координаты листа PDF-документа

Если указываются отрицательные значения, то отсчет будет вестись от правого и нижнего краев страницы соответственно.

FPDF.set_x(x):

Метод FPDF.set_x задает абсциссу текущей позиции. Если передается отрицательное значение, то отсчет ведется от правого края страницы.

FPDF.set_y(y):

Метод FPDF.set_y() устанавливает ординату y, при этом перемещает текущую абсциссу к левому полю. Если передается отрицательное значение, то отсчет ведется от нижнего края страницы.

FPDF.text(x, y, txt=''):

Метод FPDF.text() печатает строку символов, переданную в txt. Начало координат находится слева от первого символа на базовой линии.

Этот метод позволяет разместить строку точно на странице, но обычно проще использовать методы FPDF.cell(), FPDF.multi_cell() или FPDF.write().

FPDF.normalize_text(txt):

Метод FPDF.normalize_text() проверяет, что вводимый текст txt имеет правильный формат/кодировку.