Используя pdftk для слияния нескольких PDF работает хорошо. Однако какой-либо простой способ сделать закладку для каждого PDF объединенной?
Я ничего не вижу на pdftk документах относительно этого так, я не думаю, что это возможно с pdftk.
Все наши объединенные файлы составят 1 страницу, таким образом задаваясь вопросом, существует ли какая-либо другая утилита, которая может добавить в закладках впоследствии?
Или другая основанная на Linux утилита PDF, которая позволит объединяться при определении закладки для каждого отдельного PDF.
Вы также можете объединить несколько 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).
[/XYZ null null null null]
гарантирует, что область просмотра и уровень масштабирования вашей страницы не изменится по сравнению с текущей, когда вы перейдете по ссылке. (Вы можете сказать [/XYZ 222 111 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 закладок.
Причина в том, что существовавшие ранее закладки адресовали свои цели ссылок по абсолютным номерам страниц. Чтобы обойти это (и чтобы закладки работали в объединенных файлах), нужно сгенерировать закладки, которые указывают на цели ссылок по именованным пунктам назначения (и убедиться, что они одинаковы для всех объединенных документов).
(Этот подход работает и в linux, просто используйте gs вместо gswin32c.)
В командной строке выше используется [...больше опций Ghostscript по мере необходимости...]
как место для дополнительных опций.
Если вы не используете другие опции, Ghostscript будет применять встроенные значения по умолчанию для различных параметров. Однако это может привести к результатам, которые могут вам не понравиться. Поскольку Ghostscript генерирует совершенно новый PDF на основе исходных данных, это означает, что некоторые исходные объекты могут быть изменены. Это справедливо для цветовых пространств и уровней сжатия изображений.
Как применить параметры, которые оставляют первоначально внедренные изображения неизменными, можно посмотреть на SuperUser: "Используйте Ghostscript, но скажите ему не перерабатывать изображения".
К сожалению, нет простого способа сделать это. Вы можете использовать библиотеку, на которой построен pdftk, напрямую и написать программу на Java или .NET, которая использует iText или iTextSharp для объединения одностраничников и создания закладок. Если вы хотите пойти по пути iText, есть много примеров, доступных в Интернете или в книге iText (написанной автором iText).
... Или дайте мне знать, что не работает, и я смогу помочь.