Есть ли способ добавить ссылки на объединенные PDF-файлы с dompdf & ghostscript - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь создать страницу содержимого для нескольких документов PDF, которая будет содержать ссылки на начало каждого (объединенного с GS) pdf.

На данный момент у меня есть: HTML-страница, которая действует как страница содержимого, для конвертации в domPDF (эта часть работает) Несколько страниц разделителя разделов (PDF-файлы, преобразованные с помощью domPdf), которые имеют привязки раздела X внутри Дополнительные документы PDF для объединения в один большой PDF-файл со страницей содержимого.

Я запускаю GS на оболочке для обработки слияния документов PDF:

gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=save_path/final.pdf contents.pdf section1.pdf brochure1.pdf section2.pdf brochure2.pdf back.pdf

GS успешно объединяет документы PDF в 1 большой PDF.

Однако ссылки не работают.

Похоже, что PDF не может ссылаться на документы, где место назначения находится за пределами исходного файла.

Если я добавлю ссылку в файл содержимого, и в качестве пункта назначения будет указан тот же файл содержимого ... в итоговом PDF-файле ссылки будут отображаться, и они будут работать по своему усмотрению.

Итак, мой вопрос: возможно ли включить ссылку в объединенный PDF-документ, который будет ссылаться на другие объединенные PDF-файлы.

Любые указатели или предложения будут наиболее полезны.

Спасибо

David

1 Ответ

1 голос
/ 03 мая 2019

Да, проблема здесь в том, что Ghostscript не может знать, сколько страниц будет в конечном файле, когда он обрабатывает первый файл, и, что более важно, какими будут номера объектов этих страниц.

Теперь аннотация / Dest для ссылки может выглядеть примерно так: [page / XYZ left top zoom] «page» в данном случае - это объект страницы, это косвенная ссылка на объект PDF, поэтому / Ссылка на странице 1, которая ссылается на страницу 2, может выглядеть примерно так:

[18 0 R / XYZ 0 792 1]

если мы предположим, что страница 2 является объектом № 18 в выходном файле PDF.

При обработке аннотаций интерпретатор PDF выполняет их как последнее, что он делает с входным файлом PDF. Это означает, что все страницы заполнены, поэтому устройство pdfwrite знает, что страница 2 имеет (например) номер объекта 18. Таким образом, нет никаких проблем в выяснении, какая страница связана с каким номером объекта.

Но в вашем случае вы запускаете первый файл полностью, затем запускаете аннотации (перед выполнением второго файла). В то время одна или несколько ссылок указывают на страницу, которая еще не существует. Поскольку невозможно узнать, какой будет номер объекта на этой странице , который будет при выполнении последующих файлов, устройство pdfwrite не сможет обработать аннотацию Link.

Так что я боюсь, что вы не можете тривиально делать то, что вы хотите с Ghostscript. На самом деле, я не могу понять, как вы можете получить ваш файл содержимого, чтобы иметь на нем ссылки такого рода.

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

Я, возможно, упускаю суть, конечно; Вы не предоставили примеры файлов для просмотра, поэтому я не могу сказать, какие аннотации и дескрипторы Link использует ваш файл в настоящее время.

Попутно заметим, что устройство pdfwrite не «объединяет» PDF-файлы, это гораздо более сложный процесс. Вы можете найти документально оформленный процесс здесь , и я думаю, что его стоит прочитать, чтобы вы могли получить представление о возможностях и ограничениях устройства в этом случае.

Фундаментально Ghostscript и документ pdfwrite не предназначены для редактирования или манипулирования PDF-файлами.

...