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

Создание внешних и внутренних ссылок в PDF-документе

Модуль fpdf2 может генерировать как внутренние ссылки, на другие страницы в PDF-документе, так и ссылки на внешние URL-адреса, которые будут открываться в браузере.

Содержание:


Ссылка на URL-адрес методом FPDF.cell().

Метод FPDF.cell() делает кликабельным всю ячейку, а не только текст:

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=15)
text = 'Модуль fpdf2 в Python.'
# вычисляем длину строки при размере шрифта 15 
text_width = pdf.get_string_width(text)
# выводим текст с ссылкой на ячейку
pdf.cell(w=text_width, h=10, txt=text, border=1, 
        align="C", link="https://docs-python.ru/packages/modul-fpdf2-python/")
pdf.output("hyperlink.pdf")

Ссылка на URL-адрес методом FPDF.link().

Метод FPDF.link() является низкоуровневым и определяет прямоугольную интерактивную область.

Пример, показывающий, как разместить такую ​​прямоугольную ссылку поверх текста:

from fpdf import FPDF

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=18)
line_height = 10
text = "Текстовая ссылка"
# выводим текст
pdf.text(x=10, y=line_height, txt=text)
# вычисляем длину строки при размере шрифта 18 
width = pdf.get_string_width(text)
# выводим ссылку поверх текста
pdf.link(x=10, y=0, w=width, h=line_height, 
         link="https://docs-python.ru/packages/modul-fpdf2-python/", alt_text="Модуль fpdf2")
pdf.output("hyperlink.pdf")

Примечание: альтернативный текст внешней ссылки поддерживает только метод FPDF.link(). Если, при наведении курсора на альтернативный текст, последний не появляется, значит используемый просмотрщик PDF не поддерживает эту функциональность.

Ссылка на URL-адрес методом FPDF.write_html().

Альтернативный метод с использованием объекта HTMLMixin и метода FPDF.write_html(). Гиперссылки, определенные таким образом, будут отображаться синим цветом с подчеркиванием.

from fpdf import FPDF, HTMLMixin

class PDF(FPDF, HTMLMixin):
    pass

pdf = PDF()
# директория где лежат системные шрифты OS Linux
font_dir = '/usr/share/fonts/truetype/freefont'
# добавляем TTF-шрифт, поддерживающий кириллицу.
pdf.add_font("Serif", style="", fname=f"{font_dir}/FreeSerif.ttf", uni=True)
pdf.set_font("Serif", size=15)
pdf.add_page()
pdf.write_html('<a href="https://docs-python.ru/packages/modul-fpdf2-python/">Модуль fpdf2</a>')
pdf.output("hyperlink.pdf")

Ссылки/якоря на внутренние элементы PDF-документа.

Для проставления внутреннего якоря/ссылки в PDF-документе можно использовать методы FPDF.cell() и FPDF.link() аналогичным образом с проставлением внешних ссылок. Отличие состоит в создании внутренних ссылок. Метод FPDF.write_html() не позволяет определять внутренние ссылки.

Создание внутренних ссылок происходит методами FPDF.add_link() и FPDF.set_link().

Смотрите пример внутренней ссылки с методом FPDF.cell():

from fpdf import FPDF

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.set_font("Serif", size=15)
pdf.add_page()
pdf.cell(w=pdf.epw, txt="Добро пожаловать на первую страницу!", align="C")
pdf.add_page()
# создание якоря
link = pdf.add_link()
# добавление якоря на первую страницу
pdf.set_link(link, page=1)
# аргумент `link=link` добавляет ссылку на созданный якорь
pdf.cell(txt="Внутренняя ссылка на первую страницу", border=1, link=link)
pdf.output("internal_link.pdf")

Описание методов, используемых для установки ссылок:

FPDF.add_link():

Метод FPDF.add_link() создает новую внутреннюю ссылку/якорь и возвращает ее идентификатор. Внутренняя ссылка - это интерактивная область, которая ведет в другое место документа.

Затем идентификатор может быть передан в методы FPDF.cell(), FPDF.write(), FPDF.image() или FPDF.link() в качестве аргумента link. Место назначения созданной внутренней ссылки должно быть определено с помощью метода FPDF.set_link().

Смотрите пример в разделе "Ссылки/якоря на внутренние элементы PDF-документа".

FPDF.set_link(link, y=0, x=0, page=-1, zoom='null'):

Метод FPDF.set_link() определяет страницу page и положение на странице y и x, на которую указывает индификатор якоря link.

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

  • link: - int, идентификатор внутренней ссылки/якоря, возвращаемый FPDF.add_link().
  • y=0: необязательная ордината целевой позиции якоря. Значение по умолчанию: 0 (вверху страницы).
  • x=0: необязательная абсцисса целевой позиции якоря. Значение по умолчанию: 0 (вверху страницы).
  • page=-1: необязательный номер целевой страницы. по умолчанию: -1, указывает текущую страницу.
  • zoom: int, дополнительный новый уровень масштабирования после перехода по ссылке якоря. В настоящее время приложение Sumatra PDF Reader игнорируется, но отслеживается Adobe Acrobat reader.

Смотрите пример в разделе "Ссылки/якоря на внутренние элементы PDF-документа".

FPDF.link(x, y, w, h, link, alt_text=None):

Метод FPDF.link() помещает ссылку link и ее аннотацию alt_text в прямоугольную область страницы обозначенной координатами x и y и имеющую ширину w и высоту h.

Текстовые ссылки или ссылки с изображений (как внутренние ссылки, так и URL-ссылки) обычно устанавливаются через аргумент link методов FPDF.cell(), FPDF.write() или FPDF.image().

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

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

  • x: float, горизонтальное положение (слева) в левой части прямоугольника;
  • y: float, вертикальное положение (сверху) до нижней стороны прямоугольника;
  • w: float, ширина прямоугольника ссылки;
  • h: float, высота прямоугольника ссылки;
  • link: либо URL-адрес, либо целое число, возвращаемое FPDF.add_link(), определяющее внутреннюю ссылку/якорь на страницу;
  • alt_text: float, необязательное текстовое описание ссылки.

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

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

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