В PDF‑файле ссылка реализуется как аннотация типа Link. Эта аннотация задаёт прямоугольную область на странице и действие, которое выполняется при щелчке внутри этой области. Действие может быть переходом на другую страницу того же документа, открытием веб‑адреса, запуском файла или выполнением произвольного JavaScript. При работе с многостраничными документами часто возникает вопрос, как вести себя ссылки, которые указывают на страницы, содержащие свои собственные ссылки – так называемые «вложенные» ссылки. Ниже рассмотрены механизмы, ограничения и практические рекомендации по их использованию.
Структура ссылки в PDF
Каждая ссылка описывается объектом аннотации с обязательными полями:
- /Rect – координаты прямоугольника, ограничивающего активную зону;
- /Subtype – значение Link;
- /A – словарь действия (Action), определяющий, что происходит при активации.
Словарь действия может содержать разные типы:
- /GoTo – переход к указанному назначению внутри текущего документа;
- /GoToR – переход к назначению во внешнем PDF‑файле;
- /URI – открытие веб‑адреса;
- /Launch – запуск локального файла или приложения;
- /JavaScript – выполнение скрипта.
Назначение (/Dest) может задаваться напрямую в действии GoTo или через именованное место назначения, сохранённое в каталоге документа (/Names → /Dests). Назначение представляет собой массив вида [page number, /XYZ, left, top, zoom] или [page number, /Fit].
Как работают внутренние ссылки между страницами
При активации ссылки с действием GoTo PDF‑ viewer ищет указанную страницу по её номеру (отсчёт начинается с нуля) и позицию, заданную в назначении. Если в документе используются именованные назначения, viewer сначала ищет соответствие по имени, а затем переходит к связанной странице. После перехода viewer отображает страницу с учётом указанных координат и масштаба, если они присутствуют в назначении.
Важно, что номер страницы в назначении относится к текущему состоянию документа на момент создания ссылки. Если после создания ссылки страницы были добавлены, удалены или переставлены, номер может стать неверным, тогда ссылка ведёт на неправильное место или вовсе отсутствует. Именованные назначения менее подвержены этому problem, потому что они привязываются к конкретному объекту страницы, а не к её порядковому номеру.
Внешние ссылки (URI и др.)
Ссылки типа URI содержат строку с адресом (обычно начинается с http:// или https://). При активации viewer передаёт эту строку обработчику протокола операционной системы (браузер, почтовый клиент и т.п.). Внешние ссылки не зависят от структуры документа и работают одинаково независимо от числа страниц или их порядка.
Для ссылок на другие PDF‑файлы используется действие GoToR, которое указывает внешний файл и назначение внутри него. При этом viewer должен иметь доступ к указанному файлу; иначе действие завершится ошибкой.
Вложенные ссылки: что это значит на практике
Термин «вложенные ссылки» в контексте PDF обычно подразумевает два связанных сценария:
- Ссылка, которая ведёт на страницу, содержащую свои собственные ссылки (например, оглавление → глава → подраздел).
- Ссылка, чья область (/Rect) пересекается или находится внутри области другой ссылки на той же странице.
В первом случае никакой особой механики не требуется: viewer просто выполняет переход, а затем пользователь может активировать любые ссылки на целевой странице. Во втором случае поведение зависит от конкретного PDF‑viewer. Большинство программ обрабатывают верхнюю (по порядку в массиве аннотаций) ссылку, перекрывающую нижнюю. Если две ссылки пересекаются, то при клике в область пересечения сработает только та, которая расположена позже в списке аннотаций страницы. Это может приводить к тому, что часть ссылки кажется «нерабочей», хотя её аннотация присутствует в документе.
Ограничения и типичные проблемы
- Перекрывающиеся области – как описано выше, могут вызывать непредсказуемое срабатывание.
- Смещение страниц – ссылки, привязанные к номерам страниц, ломаются при изменении структуры документа.
- Отсутствие видимой границы – аннотация может быть невидимой, если не задано appearance stream (/AP) или флаг /Hidden установлен. Пользователь тогда не видит, где активная зона.
- Разные масштабы и режимы отображения – если назначение задаёт фиксированные координаты (/XYZ), то при изменении масштаба пользователь может видеть только часть страницы.
- Защищённые документы – в PDF с ограничениями на редактирование или печать аннотации могут быть недоступны для изменения, но обычно остаются кликабельными.
- Совместимость viewers – некоторые мобильные или встроенные viewers не поддерживают действия GoToR или JavaScript.
Как создавать и проверять ссылки
Большинство инструментов для создания PDF (Adobe Acrobat, LibreOffice Draw, Scribus, специализированные библиотеки типа iText, PDFtk) позволяют добавить ссылку через интерфейс или программно. Ниже – общий порядок действий, независимо от конкретного продукта.
- Определите цель ссылки: внутренний переход, внешний URI или переход к другому PDF.
- Выберите тип назначения:
- Для внутренних переходов предпочтительно использовать именованные назначения, если документ будет подвергаться редактированию.
- Если именованные назначения невозможны, укажите номер страницы и нужные координаты/режим (/Fit, /XYZ).
- Нарисуйте или укажите прямоугольник (/Rect) там, где должна быть активная зона. Убедитесь, что прямоугольники разных ссылок не пересекаются, либо осознанно решите, какой приоритет нужен.
- Задайте внешний вид ссылки (цвет, рамка, подчёркивание) через appearance stream или свойства аннотации (/BS, /C). Если appearance не задан, viewer использует стиль по умолчанию.
- Сохраните документ и протестируйте ссылки в как минимум двух разных viewers (например, Adobe Acrobat Reader и браузер‑based PDF viewer).
- При необходимости проверьте, что ссылки работают после линейного оптимизирования (fast web view) или после сжатия.
Частые ошибки и как их избежать
- Использование только номеров страниц без проверки стабильности структуры – решение: добавить именованные назначения или обновлять ссылки после каждого значительного изменения документа.
- Перекрывающиеся ссылки из‑за неточно совпадающих рамок – решение: выравнивать рамки по сетке или использовать инспектор объектов в редакторе PDF для точного позиционирования.
- Отсутствие appearance stream, делающее ссылку невидимой – решение: явно задать границу или фоновый цвет, либо включить отображение аннотаций в настройках viewer.
- Назначение с неправильным масштабом, вызывающее «прыгающее» отображение – решение: использовать /Fit или /FitH если точная позиция не критична, либо явно указывать нужный zoom.
- Ссылки на внешние файлы с относительными путями – решение: применять абсолютные пути или убедиться, что рабочая директория viewers совпадает с ожидаемой.
- Для сложной навигации (оглавление, указатель) создавайте отдельный набор именованных назначений и используйте их во всех ссылках.
- Если документ будет часто редактироваться, храните ссылки в отдельном слое или группе, чтобы легче находить и обновлять их.
- Проверяйте видимость ссылок: включите режим отображения аннотаций в viewer, чтобы убедиться, что все нужные зоны отмечены.
- При подготовке документа для печати или архивации оставьте ссылки, но убедитесь, что они не влияют на размер файла значительно (аннотации занимают мало места).
- Если нужен fallback для старых viewers, дублируйте важные переходы как видимый текст с указанием номера страницы рядом с ссылкой.
Практические рекомендации
Эта статья носит информационный характер. При работе с юридически значимыми или технически критичными документами рекомендуется проверять поведение ссылок в целевых программах просмотра и, при необходимости, консультироваться со специалистом по формату PDF.
