В материале представлены примеры, а так же описываются методы, позволяющие управлять стилем выводимого текста в создаваемом PDF-документе, а именно задавать и изменять шрифт, стиль, размер и цвет текста по ходу его вывода.
FPDF.add_font()
импортирует шрифт TrueType
;FPDF.set_font()
устанавливает шрифт, его стиль и размер;FPDF.set_stretching()
устанавливает горизонтальное растяжение шрифта;FPDF.set_text_color()
задает цвет текста;FPDF.set_fill_color()
задает цвет заливки;FPDF.write()
печатает текст с текущей позиции;FPDF.ln()
добавляет перевод строки;FPDF.get_string_width()
возвращает длину строки с учетом размера шрифта;FPDF.font_size
возвращает текущую высоту шрифта;FPDF.eph
возвращает эффективную высоту страницы;FPDF.epw
возвращает эффективную ширину страницы;FPDF.get_x()
возвращает абсциссу текущей позиции;FPDF.get_y()
возвращает ординату текущей позиции;FPDF.set_xy()
задает текущее положение курсора;FPDF.set_x()
задает текущее положение курсора по горизонтали;FPDF.set_y()
задает текущее положение курсора по вертикали;FPDF.text(x, y, txt='')
печатает строку символов;FPDF.normalize_text()
проверяет правильность формата/кодировки.Модуль 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
поддерживает два альтернативных способа стилизации текста:
FPDF.cell()
может быть передан необязательный аргумент markdown=True
, который включит базовый стиль, подобный Markdown: **bold**
, __italics__
, --underlined--
;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")
FPDF.write()
печатает текст с текущей позиции;FPDF.ln()
добавляет перевод строки;FPDF.get_string_width()
возвращает длину строки с учетом размера шрифта;FPDF.font_size
возвращает текущую высоту шрифта;FPDF.eph
возвращает эффективную высоту страницы;FPDF.epw
возвращает эффективную ширину страницы;FPDF.get_x()
возвращает абсциссу текущей позиции;FPDF.get_y()
возвращает ординату текущей позиции;FPDF.set_xy()
задает текущее положение курсора;FPDF.set_x()
задает ординату текущей позиции;FPDF.set_y()
задает абсциссу текущей позиции;FPDF.text(x, y, txt='')
печатает строку символов;FPDF.normalize_text()
проверяет правильность формата/кодировки.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
имеет правильный формат/кодировку.