Объединить PDF с PDFTK с закладками?

Используя pdftk для слияния нескольких PDF работает хорошо. Однако какой-либо простой способ сделать закладку для каждого PDF объединенной?

Я ничего не вижу на pdftk документах относительно этого так, я не думаю, что это возможно с pdftk.

Все наши объединенные файлы составят 1 страницу, таким образом задаваясь вопросом, существует ли какая-либо другая утилита, которая может добавить в закладках впоследствии?

Или другая основанная на Linux утилита PDF, которая позволит объединяться при определении закладки для каждого отдельного PDF.

33
задан Kurt Pfeifle 2 October 2010 в 20:33
поделиться

2 ответа

Вы также можете объединить несколько PDF с помощью Ghostscript. Большим преимуществом этого пути является то, что решение легко настраивается сценарием и не требует реальных усилий по программированию:

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          input1.pdf input2.pdf input3.pdf [....]

С помощью Ghostscript вы сможете передавать pdfmark операторы, которые могут добавить оглавление, а также закладки для каждого дополнительного исходного файла, входящего в результирующий PDF. Например:

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          file-with-pdfmarks-to-generate-a-ToC.ps ^
          -f input1.pdf input2.pdf input3.pdf [....]

или

gswin32c.exe ^
          -dBATCH -dNOPAUSE ^
          -sDEVICE=pdfwrite ^
          -sOutputFile=merged.pdf ^
          [...more Ghostscript options as needed...] ^
          file-with-pdfmarks-to-generate-a-ToC.ps ^
          -f input1.pdf ^
             input2.pdf ^ 
             input3.pdf [....]

Для некоторого введения в тему pdfmark см. также статью Томаса Мерца PDFmark Primer.


Редактировать:
Я хотел привести пример для file-with-pdfmarks-to-generate-a-ToC.ps, но почему-то забыл. Вот он:

[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark
[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark
[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark
[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark 

Это создаст ToC для первых 4 файлов == первых 4 страниц (поскольку вы гарантируете, что ваши ингредиентные файлы будут по 1 странице для объединенного выходного PDF).

  1. Часть [/XYZ null null null null] гарантирует, что область просмотра и уровень масштабирования вашей страницы не изменится по сравнению с текущей, когда вы перейдете по ссылке. (Вы можете сказать [/XYZ 222 111 2], чтобы сделать это, если вам нужен произвольный пример.)
  2. Фишка /Title (какая-либо строка по вашему желанию) определяет, какой текст находится в ToC.

И вы даже можете добавить эти параметры в командную строку Ghostscript напрямую:

gswin32c.exe ^
       -o merged.pdf ^
       [...more Ghostscript options as needed...] ^
       -c "[/Page 1 /View [/XYZ null null null] /Title (File 1) /OUT pdfmark" ^
       -c "[/Page 2 /View [/XYZ null null null] /Title (File 2) /OUT pdfmark" ^
       -c "[/Page 3 /View [/XYZ null null null] /Title (File 3) /OUT pdfmark" ^
       -c "[/Page 4 /View [/XYZ null null null] /Title (File 4) /OUT pdfmark" ^
       -f input1.pdf ^
          input2.pdf ^ 
          input3.pdf ^ 
          input4.pdf [....]



'nother Edit:

О, и кстати: Ghostscript сохраняет закладки, когда вы используете его для объединения двух PDF файлов в один - pdftk.exe этого не делает. Давайте воспользуемся тем, что сгенерировано командой моей первой правки (фактически конкатенирующей 2 копии одного и того же файла):

 gswin32c ^
    -sDEVICE=pdfwrite ^
    -o doublemerged.pdf ^
     merged.pdf ^
     merged.pdf

Файл doublemerged.pdf теперь будет иметь 2*4 = 8 закладок.

  • Как и ожидалось: закладки 1, 2, 3 и 4 ссылаются на страницы 1, 2, 3 и 4.
  • Проблема в том, что закладки 5, 6, 7 и 8 также ссылаются на страницы 1, 2, 3 и 4.

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

(Этот подход работает и в linux, просто используйте gs вместо gswin32c.)


Приложение

В командной строке выше используется [...больше опций Ghostscript по мере необходимости...] как место для дополнительных опций.

Если вы не используете другие опции, Ghostscript будет применять встроенные значения по умолчанию для различных параметров. Однако это может привести к результатам, которые могут вам не понравиться. Поскольку Ghostscript генерирует совершенно новый PDF на основе исходных данных, это означает, что некоторые исходные объекты могут быть изменены. Это справедливо для цветовых пространств и уровней сжатия изображений.

Как применить параметры, которые оставляют первоначально внедренные изображения неизменными, можно посмотреть на SuperUser: "Используйте Ghostscript, но скажите ему не перерабатывать изображения".

41
ответ дан 27 November 2019 в 18:08
поделиться

К сожалению, нет простого способа сделать это. Вы можете использовать библиотеку, на которой построен pdftk, напрямую и написать программу на Java или .NET, которая использует iText или iTextSharp для объединения одностраничников и создания закладок. Если вы хотите пойти по пути iText, есть много примеров, доступных в Интернете или в книге iText (написанной автором iText).

... Или дайте мне знать, что не работает, и я смогу помочь.

1
ответ дан 27 November 2019 в 18:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: