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

Определение макета/стиля PDF-документа, модуль fpdf2 в Python

Формат страницы, ориентация, отступы, разрыв страницы PDF-документа

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

Содержание:


Формат и ориентация страниц ВСЕГО PDF-документа.

По умолчанию, модуль 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.

Определение полей/отступов листа 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. По умолчанию используются миллиметры.

Управление разрывами страниц в PDF-документе.

По умолчанию, модуль 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 - высота разрыва строки. По умолчанию равно высоте последней выведенной ячейки.