В материале представлены примеры, а так же описываются методы, позволяющие определить макет создаваемого PDF-документа, а именно задать формат листа создаваемого PDF-документа, его ориентацию, определить отступы от краев листа, так же описано управление разрывами страниц во время создания документа.
FPDF()
создает основной объект PDF-документа;FPDF.add_page()
добавляет новую страницу в PDF-документ;FPDF.set_margin()
устанавливает одинаковые значения всех полей документа;FPDF.set_left_margin()
устанавливает левое поле;FPDF.set_right_margin()
устанавливает правое поле;FPDF.set_top_margin()
устанавливает верхнее поле;FPDF.set_margins()
устанавливает значения левого, верхнего и правого полей;FPDF.set_auto_page_break()
устанавливает значения нижнего поля, при котором будет срабатывать разрыв страницы;FPDF.unbreakable()
пытается уместить контент на одной странице;FPDF.ln()
добавляет перевод строки.По умолчанию, модуль fpdf2
создает PDF-документ формата 'A4'
и книжной ориентацией страницы.
Задать новые размеры и ориентацию страниц, в качестве значений по умолчанию для всего PDF-документа, можно в конструкторе класса FPDF()
:
Например:
import fpdf pdf = fpdf.FPDF(orientation="landscape", format="A5")
В настоящее время поддерживаются форматы 'A3'
, 'A4'
, 'A5'
, 'letter'
и 'legal'
или в качестве формата можно указать кортеж с пользовательскими размерами листа (width, height)
выраженные, по умолчанию, в миллиметрах.
FPDF()
.FPDF(orientation='portrait', unit='mm', format='A4', font_cache_dir=True)
:Класс FPDF()
создает основной объект PDF-документа.
Принимаемые аргументы:
orientation='portrait'
: возможные значения 'portrait'
(может быть сокращен до 'P'
) или 'landscape'
(может быть сокращен до 'L'
). По умолчанию: 'portrait'
.unit='mm'
: единица измерения, возможные значения: 'pt'
, 'mm'
, 'cm'
, 'in'
или число (int
или float
) . Точка равна 1/72 дюйма, то есть около 0,35 мм (дюйм равен 2,54 см). Это очень распространенная единица в типографике, размеры шрифта выражаются в этой единице. Если задано число, то оно будет рассматриваться как количество баллов на единицу, например 72 = 1 дюйм. По умолчанию 'мм'.format='A4'
: возможные значения 'A3'
, 'A4'
, 'A5'
, 'letter'
, 'legal'
или кортеж с размерами листа (width, height)
указанные в unit
единицах.font_cache_dir
: Путь до папки, в котором будут храниться кэшированные файлы подключенных TTF-шрифтов в формате pickle
. Значение None
отключает кэширование шрифтов. По умолчанию установлено значение True
, что означает кэширование в текущую папку.Модуль fpdf2
поддерживает добавление разных форматов/размеров и ориентаций страниц в один PDF-документ с помощью метода FPDF.add_page()
. Вызов метода FPDF.add_page()
без аргументов, добавит новый лист с размерами и ориентацией, заданными по умолчанию, при создании экземпляра FPDF()
.
Следующий фрагмент кода показывает, как настроить разные форматы страниц в одном PDF-документе:
from fpdf import FPDF pdf = FPDF() pdf.set_font("Helvetica") for i in range(9): # добавление страниц разных размеров # для `format` используется кортеж с размерами листа pdf.add_page(format=(210 * (1 - i/10), 297 * (1 - i/10))) # печатаем номер страницы pdf.cell(txt=str(i)) # добавим страницу, с теми же параметрами # что и на предыдущей странице pdf.add_page(same=True) pdf.cell(txt="9") pdf.output("varying_format.pdf")
Метод FPDF.add_page()
так же, как и конструктор FPDF()
принимает аргумент orientation
ориентация листа в PDF-документе .
FPDF.add_page()
.FPDF.add_page(orientation='', format='', same=False, duration=0, transition=None)
:Метод FPDF.add_page()
добавляет новую страницу в PDF-документ. Если страница уже существует, то сначала вызывается метод FPDF.footer()
. Затем текущая позиция устанавливается в верхнем левом углу относительно левого и верхнего полей, и вызывается метод FPDF.header()
.
Примечание: методы FPDF.footer()
и FPDF.header()
должны быть реализованы в пользовательском классе, унаследованном от FPDF. Примеры пользовательской реализации этих классов смотрите в материале "Верхний/нижний колонтитулы PDF-документа".
Принимаемые аргументы:
orientation='portrait'
: возможные значения 'portrait'
(может быть сокращен до 'P'
) или 'landscape'
(может быть сокращен до 'L'
). По умолчанию: 'portrait'
.format='A4'
: возможные значения 'A3'
, 'A4'
, 'A5'
, 'letter'
, 'legal'
или кортеж с размерами листа (width, height)
указанные в unit
единицах.same=False
: указывает на использование того же формата страницы, что и на предыдущей странице. duration=0
: float
, необязательная продолжительность отображения страницы, то есть максимальная продолжительность в секундах, в течение которой страница отображается в режиме презентации, прежде чем PDF-читалка автоматически перейдет к следующей странице. Можно настроить глобально с помощью свойства FPDF.page_duration
. По состоянию на июнь 2021 года, поддерживается программой чтения Adobe Acrobat, но игнорируется программой чтения документов Sumatra PDF.transition=None
: должен быть подклассом Transition
, необязательный визуальный переход для использования при переходе с другой страницы на данную страницу во время презентации. Можно настроить глобально с помощью свойства FPDF.page_transition
. По состоянию на июнь 2021 года, поддерживается программой чтения Adobe Acrobat, но игнорируется программой чтения документов Sumatra PDF.По умолчанию, создаваемый при помощи модуля fpdf2
PDF-документ имеет поле 2 см внизу листа и поля в 1 см с остальных сторон листа.
Эти поля управляют начальным текущим положением курсора: атрибуты FPDF.get_x()
и FPDF.get_y()
для отображения элементов на странице, а также определяют предел высоты, который запускает автоматические разрывы страниц, если он включен.
Поля можно полностью убрать, используя метод FPDF.set_margin(0)
.
FPDF.set_margin(margin)
:Метод FPDF.set_margin()
устанавливает для правого, левого, верхнего и нижнего полей создаваемого PDF-документа одинаковое значение margin
.
Аргумент margin
целое число, выраженное в единицах unit
, которое можно задать в конструкторе FPDF
. По умолчанию используются миллиметры.
FPDF.set_left_margin(margin)
:Метод FPDF.set_left_margin()
устанавливает левое поле создаваемого PDF-документа. Также устанавливает текущий атрибут FPDF.get_x()
на странице в это минимальное положение по горизонтали.
Аргумент margin
целое число, выраженное в единицах unit
, которое можно задать в конструкторе FPDF
. По умолчанию используются миллиметры.
FPDF.set_right_margin(margin)
:Метод FPDF.set_right_margin()
устанавливает правое поле создаваемого PDF-документа.
Аргумент margin
целое число, выраженное в единицах unit
, которое можно задать в конструкторе FPDF
. По умолчанию используются миллиметры.
FPDF.set_top_margin(margin)
:Метод FPDF.set_top_margin()
устанавливает верхнее поле создаваемого PDF-документа. Также устанавливает текущий атрибут FPDF.get_y()
на странице в это минимальное вертикальное положение.
Аргумент margin
целое число, выраженное в единицах unit
, которое можно задать в конструкторе FPDF
. По умолчанию используются миллиметры.
FPDF.set_margins(left, top, right=-1)
:Метод FPDF.set_margins()
устанавливает одинаковое значение для левого left
, верхнего top
и, возможно, правого right
полей создаваемого PDF-документа.
Вызов метода FPDF.set_margins()
без аргументов установит все отступы равными 1 см. Метод также устанавливает текущий атрибут FPDF.get_y()
на странице в это минимальное вертикальное положение.
FPDF.set_auto_page_break(auto=True, margin=0)
:Метод FPDF.set_auto_page_break()
устанавливает режим автоматического разрыва страницы, а так же нижнее поле/отступ margin
создаваемого PDF-документа, при котором он срабатывает. Нижнее поле по умолчанию составляет 2 см.
Аргументы:
auto=True
включает/отключает режим автоматического разрыва страницы. По умолчанию режим включен.margin=0
целое число, выраженное в единицах unit
, которое можно задать в конструкторе FPDF
. По умолчанию используются миллиметры.По умолчанию, модуль fpdf2
автоматически выполняет разрывы страниц всякий раз, когда строка/ячейка, выводимая внизу страницы, превышает высоту нижнего пространства (оставшуюся высоту от нижнего поля/отступа листа).
Этим поведением можно управлять с помощью методов:
FPDF.set_auto_page_break()
включение/выключение автоматического разрыва страницы, FPDF.add_page()
установка разрыва страницы вручную, FPDF.unbreakable()
пытается уместить контент на одной странице, предварительно выполняя разрыв страницы, если контент не умещается.FPDF.unbreakable()
:Метод FPDF.unbreakable()
гарантирует, что весь рендеринг, выполняемый в этом контексте, отображается на одной странице, предварительно выполняя разрыв страницы, если это необходимо.
Примечание: Использование этого метода означает дублирование bytearray
буфера, следовательно при создании больших PDF-файлов удвоение использования памяти может вызвать проблемы.
Метод FPDF.unbreakable()
полезен при отображении контента таблиц, которые не должны быть разделены между страницами. Метод FPDF.unbreakable()
используется как диспетчер контекста:
from fpdf import FPDF data = [ ("Имя", "Фамилия", "Возраст", "Город"), ("Jules", "Smith", "34", "San Juan"), ("Mary", "Ramos", "45", "Orlando"), ("Carlson", "Banks", "19", "Los Angeles"), ("Lucas", "Cimon", "31", "Saint-Mahturin-sur-Loire"), ] pdf = FPDF() # директория где лежат системные шрифты OS Linux font_dir = '/usr/share/fonts/truetype/freefont' # добавляем TTF-шрифт, поддерживающий кириллицу. pdf.add_font("Serif", style="", fname=f"{font_dir}/FreeSerif.ttf", uni=True) pdf.add_page() pdf.set_font("Serif", size=16) # высота строки таблицы line_height = pdf.font_size * 2 # ширина колонок будет одинаковая col_width = pdf.epw / 4 # повторим таблицу 4 раза for i in range(4): with pdf.unbreakable() as pdf: # выводим название таблицы pdf.write(txt=f"Таблица №{i+1}") # принудительный разрыв СТРОКИ pdf.ln() # выводим таблицу for row in data: for datum in row: pdf.cell(col_width, line_height, datum, border=1) pdf.ln(line_height) pdf.ln(line_height * 2) pdf.output("unbreakable_tables.pdf")
FPDF.ln(h=None)
:Метод FPDF.ln()
добавляет перевод строки. Текущая абсцисса FPDF.get_x()
возвращается к левому полю, а ордината FPDF.get_y()
увеличивается на величину, переданную в качестве аргумента h
.
Аргумент h
- высота разрыва строки. По умолчанию равно высоте последней выведенной ячейки.