Вопрос или проблема
У меня часто возникает ситуация, когда у меня есть PDF, содержащий страницы с текстом, и некоторые слова в тексте имеют ссылки, которые указывают на другие страницы в том же PDF. Есть ли способ сделать так, чтобы номер страницы, на которую указывает каждая ссылка, появлялся напротив ссылки (т.е. с тем же значением Y, что и у ссылки, и значением X, почти до правого края страницы), чтобы кто-то, использующий бумажную копию PDF (который поэтому не может кликать по ссылкам), мог видеть, на какой номер страницы указывает ссылка, чтобы он мог перелистать на эту страницу?
Я смотрел Adobe Acrobat, PDF X-Change Editor, Nitro PDF и Foxit, но ни у одного из них нет функции, которая могла бы это сделать.
TL;DR Если вас интересует более широкий контекст (не обязательно для понимания вопроса, а просто из интереса), то контекст — это юридическая процедура. На судебном заседании есть собрание документов, объединенных в один PDF с закладками. Некоторые документы являются свидетельствами. Большинство документов — это обычные письма, электронные письма, счета, фотографии и т.д. из прошлого, которые оказываются актуальны для темы судебного дела. Свидетельства будут ссылаться на конкретные документы, но документы, на которые они ссылаются, не будут расположены сразу после каждого свидетельства, а будут рассеяны по всему PDF (потому что они должны быть в определенном порядке). Чтобы упростить чтение свидетельств, каждый раз, когда свидетельство упоминает документ, слова, ссылающиеся на этот документ, гиперссылкаются на этот документ. До сих пор все понятно. Но не все пользуются PDF. Некоторые люди просто используют распечатку PDF и поэтому не могут использовать гиперссылки. Чтобы учесть их, номер страницы PDF каждого документа, гиперссылка на который находится в свидетельстве, пишется напротив гиперссылки.
То, как ссылки хранятся в PDF, означает, что на странице нет “якоря”. Самый простой способ это увидеть — это посмотреть, как описаны страницы. Поэтому для простоты я написал этот файл из 3 страниц, где верхнее правое положение, как в флипбуке, ведет на следующую страницу.
Ясно, что “ничего” не видно (это просто горячая точка), и все записи страниц ничего не содержат в их коде. Здесь они, где “содержимое” страниц 9, 10 и 11, но все говорят /Length 0 (ничего не показывать), поэтому нам нужно прочитать и экспортировать связывающие объекты, прежде чем что-либо добавлять в файл.
%PDF-1.7
1 0 obj<</Names<</Dests 2 0 R>>/Pages 3 0 R/Type/Catalog>>endobj
3 0 obj<</Count 3/Kids[5 0 R 6 0 R 4 0 R]/Type/Pages>>endobj
5 0 obj<</Annots[7 0 R]/MediaBox[0 0 595 842]/Parent 3 0 R/Resources<<>>/Type/Page/Contents 9 0 R>>endobj
7 0 obj<</A<</D[6 0 R/XYZ null null null]/S/GoTo>>/Border[0 0 0]/C[0 0 0]/F 4/NM(1265dfdf-e57e-4f60-94f4dc2d4d08c9aa)/P 5 0 R/Rect[450 750 595 842]/Subtype/Link/Type/Annot>>endobj
9 0 obj<</Length 0>>
stream
endstream
endobj
6 0 obj<</Annots[8 0 R]/MediaBox[0 0 595 842]/Parent 3 0 R/Resources<<>>/Type/Page/Contents 10 0 R>>endobj
8 0 obj<</A<</D(Page3)/S/GoTo>>/Border[0 0 0]/C[0 0 0]/F 4/NM(7f204e9d-9862-4269-9776358454c37864)/P 6 0 R/Rect[450 750 595 842]/Subtype/Link/Type/Annot>>endobj
10 0 obj<</Length 0>>
stream
endstream
endobj
2 0 obj<</Names[(Page3)[4 0 R/XYZ 0 842 null]]>>endobj
4 0 obj<</MediaBox[0 0 595 842]/Parent 3 0 R/Resources<<>>/Type/Page/Contents 11 0 R>>endobj
11 0 obj<</Length 0>>
stream
endstream
endobj
xref
0 12
0000000000 65536 f
0000000009 00000 n
0000000782 00000 n
0000000074 00000 n
0000000838 00000 n
0000000136 00000 n
0000000468 00000 n
0000000242 00000 n
0000000575 00000 n
0000000422 00000 n
0000000736 00000 n
0000000931 00000 n
trailer
<</Size 12/Root 1 0 R/ID[<4657E6C7218E18DED2570E82964D21E2><9946E25234503908D6698FAD5FE9296F>]>>
startxref
0978
%%EOF
Вывод ссылок в виде таблицы будет выглядеть следующим образом:
Title,"Modification Date","Placement Page","Link Rectangle","Border Color","Border Style","Border Width","Highlight Type",Actions
<None>,,1,"450,750,595,842",#000000,Solid,0,Invert,"goto:{2, XYZ, 15}"
<None>,,2,"450,750,595,842",#000000,Solid,0,Invert,"goto:{3, XYZ, 12, 0.000, 842.000}"
Запись вывода можно добавить справа от верхних правых углов, легко расширив страницы с 595 до, скажем, 842 (так же, как высота страницы), иначе номера будут бессмысленны, так как нарушены вставкой дополнительных страниц.
Проблема сейчас в том, что страницы не имеют аннотаций в виде текста, мы должны будем добавить множество дополнительных сложных ресурсов редактора, таких как шрифты и их расположения и отображения и т.д., значительно увеличивая файл.
Обычный метод экспорта и импорта в PDF — это совместимый формат FDF. Поэтому экспорт goto может показаться сложным, поскольку может варьироваться, но существует только несколько целевых частей.
Вот экспорт (упрощенный до одиночных строк для краткости).
%FDF-1.4
%âãÏÓ
1 0 obj<</FDF<</Annots [2 0 R 3 0 R]/F (source.pdf)/ID [<4657E6C7218E18DED2570E82964D21E2> <9946E25234503908D6698FAD5FE9296F>]/UF (source.pdf)>>
/Type /Catalog>>
endobj
2 0 obj<</A <</D [1 /XYZ null null null]/S /GoTo>>/Border [0 0 0]/C [0 0 0]/F 4/NM (1265dfdf-e57e-4f60-94f4dc2d4d08c9aa)/Page 0/Rect [450 750 595 842]/Subtype /Link/Type /Annot>>endobj
3 0 obj<</A <</D (Page3)/S /GoTo>>/Border [0 0 0]/C [0 0 0]/F 4/NM (7f204e9d-9862-4269-9776358454c37864)/Page 1/Rect [450 750 595 842]/Subtype /Link/Type /Annot>>endobj
trailer
<</Root 1 0 R>>
%%EOF
Ключевые моменты — это слово goto и номера страниц в PDF ВСЕГДА начинаются с 0
для первой страницы.
Теперь мы можем заменить этот экспорт на измененный импорт по типу
%FDF-1.4
%âãÏÓ
1 0 obj<</FDF <</Annots [2 0 R 3 0 R]/F (source.pdf)/ID [<4657E6C7218E18DED2570E82964D21E2> <9946E25234503908D6698FAD5FE9296F>]/UF (source.pdf)>>/Type /Catalog>>endobj
2 0 obj<</Type/Annot/Subtype/FreeText/BS<</W 0>>/DS (font-family:Helvetica New;font-size:10pt;color:#000000;)/F 4/IT /FreeTextTypewriter/Subj (Typewriter)
/DA (0 0 0 rg /F1 10 Tf)/Page 0/Rect [550 788 595 810]/Contents (Page 2)
>>endobj
3 0 obj<</Type/Annot/Subtype/FreeText/BS<</W 0>>/DS (font-family:Helvetica New;font-size:10pt;color:#000000;)/F 4/IT /FreeTextTypewriter/Subj (Typewriter)
/DA (0 0 0 rg /F1 10 Tf)/Page 1/Rect [550 788 595 810]/Contents (Page 3)
>>endobj
trailer
<</Root 1 0 R>>
%%EOF
И желаемый результат — комментарии на полях
Задача заключается в простой задаче — редактировать экспорт аннотаций в желаемый импорт аннотаций, используя любой язык программирования. Это было сделано в MS Notepad, но Notepad++ был бы более подходящим с его функциями макросов.
Многие пользователи PDF используют более сложные зависимости, такие как Python для редактирования в сочетании с, например, PyMuPDF для редактирования PDF. Однако большинство операционных систем могут выполнять редактирование простого текста с помощью командной строки. Основная проблема заключается в декомпрессии PDF в его исторический текстовый формат. Все это, возможно, можно сделать с помощью командной строки PDFtk.
Если вы откроете FDF, выбрав или запустив его с командной строки с помощью PDFXedit. Он автоматически загрузит PDF и добавит аннотации для вас.
Вы можете увидеть ту же возможность в Acrobat, если у вас есть ЛЮБОЙ подходящий PDF файл для импорта. Сохраните второй FDF, как я написал его, и откройте его с помощью Acrobat Reader. Который попросит исходный PDF и предупредит вас о безопасности открытия неизвестного импорта. Вы должны увидеть, как комментарии появляются в правом верхнем углу страницы 1 и страницы 2. Точно так же, как они появятся с любым исходником, так как комментарии не прикреплены ни к какому якорному объекту, и гиперссылки тоже. ВСЕ такие объекты — это просто области, которые связываются С содержимым страниц, поэтому они не происходят из объекта на странице.
.
Ответ или решение
Создание автоматической разметки PDF с указанием целевого номера страницы напротив каждой ссылки может быть сложной задачей, но при этом вполне выполнимой. Это особенно актуально в контексте юридических процедур, когда необходимо предоставить доступ к документам как в цифровом виде, так и в распечатанном варианте. Для решения этой задачи можно использовать комбинацию программных инструментов и скриптов для автоматизации процесса. Давайте подробнее рассмотрим, как это можно реализовать.
Шаги по автоматической разметке PDF-файлов
1. Анализ структуры PDF
PDF-файлы состоят из объектов, которые описывают страницы, аннотации, ссылки и другие элементы. Для работы с этими элементами необходимо распаковать PDF в текстовый формат, чтобы получить доступ к нужным объектам. Это можно сделать с помощью инструментов командной строки, таких как PDFtk или сторонние библиотеки для программирования на Python, например, PyPDF2 или PyMuPDF.
2. Извлечение и обработка ссылок
Необходимо извлечь информацию о гиперссылках из PDF. Эта информация обычно включает в себя номер страницы назначения и координаты ссылки. Например, каждая ссылка может быть описана как аннотация (Annot), которая включает данные о целевой странице (например, /D [3 0 R/XYZ…], где 3 0 R — это ссылка на объект страницы).
3. Создание FDF-файла для добавления аннотаций
Поскольку PDF не предоставляет стандартных инструментов для добавления текста на страницы, мы можем воспользоваться форматом FDF для вставки примечаний и аннотаций в PDF. FDF (Forms Data Format) позволяет определить новые аннотации (например, FreeText), которые могут содержать текстовые подсказки с указанием номеров страниц.
%FDF-1.4
1 0 obj
<< /FDF << /Annots [2 0 R 3 0 R] /F (source.pdf) >>
>>
endobj
2 0 obj
<< /Type /Annot /Subtype /FreeText /Page 0 /Rect [550 788 595 810] /Contents (Страница 2) >>
endobj
3 0 obj
<< /Type /Annot /Subtype /FreeText /Page 1 /Rect [550 788 595 810] /Contents (Страница 3) >>
endobj
trailer
<< /Root 1 0 R >>
%%EOF
4. Автоматизация процесса
Используя программирование на Python или другом языке, вы можете автоматически обрабатывать PDF, извлекать информацию о ссылках и создавать соответствующий FDF-файл. После чего, этот FDF-файл может быть загружен в PDF-редактор, такой как Adobe Acrobat или PDF X-Change Editor, для автоматического добавления аннотаций в исходный PDF.
5. Итоги и преимущества
Реализовав этот процесс, вы сможете автоматически добавлять информацию о целевых номерах страниц напротив каждой ссылки. Это решит проблему для пользователей, работающих с распечатанными версиями PDF, и обеспечит лучшую навигацию по документу.
Таким образом, данная методика позволяет эффективно и удобно работать с документами в юридическом контексте, обеспечивая доступ к информации и повышая удобство использования документов. Вышеописанный подход можно адаптировать и расширить в зависимости от потребностей вашего проекта.