Объединить PDF с PDFTK с закладками? - PullRequest
33 голосов
/ 04 июня 2010

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

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

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

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

Ответы [ 11 ]

41 голосов
/ 24 июня 2010

Вы также можете объединить несколько 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 .


Edit:
Я хотел дать вам пример для 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 страниц (так как вы гарантируете, что ваши файлы ингредиентов по одной странице для вашего объединенного выходного PDF).

  1. Часть [/XYZ null null null] гарантирует, что область просмотра страницы и уровень масштабирования не изменятся с текущего при переходе по ссылке. (Вы можете сказать [/XYZ 222 111 2], чтобы сделать это, если хотите произвольный пример.)
  2. /Title (some string you want) thingie определяет, какой текст в 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 Редактировать:

Да, и кстати: 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.)


Приложение

Выше командной строки используется [...more Ghostscript options as needed...] в качестве заполнителя для дополнительных параметров.

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

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

10 голосов
/ 02 декабря 2013

Я знаю, что другие способы сделать это уже упоминались, но с помощью pdftk вы можете взять объединенный файл PDF и добавить в него закладки, используя функцию dump_data pdftk, чтобы создать файл .info существующей информации в файле PDF. Затем вы можете добавить информацию о закладке в файл .info, добавив следующие четыре строки для каждой закладки

BookmarkBegin
BookmarkTitle: name
BookmarkLevel: level
BookmarkPageNumber: page number

Затем используйте вызов update_info, чтобы обновить объединенные закладки PDF с теми, которые вы написали в .info файле. Я написал несколько простых функций, которые делают это для меня в autohotkey, если кому-то интересно. Смотри http://www.autohotkey.com/board/topic/98985-scripts-to-merge-pdfs-and-add-bookmarks-with-pdftk/

5 голосов
/ 22 июля 2013

См. Этот ответ на https://stackoverflow.com/a/17781138/547578. Я использовал что-то под названием Сейда.Оно работает.Он отлично сочетает в себе закладки.Спасибо @ blablatros.

4 голосов
/ 08 января 2012

Слишком добавить или редактировать PDF-закладки, которые вы можете использовать JPdfBookmarks . Это отличный инструмент для свободного программного обеспечения, работающий на нескольких ОС, который я использую уже некоторое время, с отличными результатами. Он работает только с закладками, поэтому вам понадобится другой инструмент для слияния или изменения порядка страниц. В дополнение к pdftk я предлагаю попробовать PDF Split and Merge (хорошее приложение, но странный интерфейс, портит закладки из моего опыта), PDF-Shuffler (кажется, работает нормально, но иногда зависает при работе с некоторыми файлами) или PdfMod (возможно, лучше всего, когда речь идет о перестановке, объединении и работе с закладками, хотя я не смог выяснить, как добавить PDF на определенную страницу) .

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

2 голосов
/ 29 мая 2015

Может быть, полезно следующее. Я хотел объединить все PDF-файлы (in_nn.pdf), расположенные в одном каталоге, в один out.pdf, в котором имена входных PDF-файлов (in_nn) называются ToC. Я написал скрипт на python, который читает имена, извлекает номера страниц и генерирует файл с именем pdfmarks. Слияние файлов тогда легко сделать с помощью gs. Точная команда выводится сценарием и должна выполняться отдельно (возможно, с некоторыми изменениями из-за изменений размера страницы или из-за операционной системы).

Вот оно. Возможно, некоторые изменения необходимы для Windows? (извините за комментарии не на английском языке). Просто запустите скрипт python в каталоге, где находятся PDF-файлы для слияния.

#!/usr/bin/env python

import subprocess

# Dieses Skript dient dazu, eine Reihe von pdfs zu einem einzigen pdf zusammenzufassen und bookmarks fuer diese pdf-Datei zu erzeugen.
# Dafuer wird ein Datei pdfmark benoetigt, die mit diesem Skript erzeugt wird.
# Dazu einfach dieses Skript in dem Verzeichnis aufrufen, das genau alle zusammenzufassenden pdfs (*pdf, s.u.) enthaelt.
# Das zusammenfassende pdf wird dann mit diesem Befehl (in der bash) generiert:
# gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile="all.pdf" $(ls *pdf ) pdfmarks
# Bereits Inhaltsverzeichnisse bleiben erhalten, die neuen kommen ans Ende des Inhaltsverzeichnisses.
#
# pdfmarks sieht dabei prinzipiell so aus:
#
# [/Title (Nr. 1) /Page 1 /OUT pdfmark
# [/Title (Nr. 2) /Page 5 /OUT pdfmark
# [/Title (Nr. 3) /Page 9 /OUT pdfmark
# usw.

p = subprocess.Popen('ls *pdf', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

pdfdateien = []
kombinationen = []

for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
  pdfdateien.append(line)


for datei in pdfdateien:
  cmd = "pdfinfo %s" %datei 
  q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  kombination = [datei]

for line in p.stdout.readlines():
# p enthaelt alle pdf-Dateinamen
  pdfdateien.append(line)


for datei in pdfdateien:
  cmd = "pdfinfo %s" %datei 
  q=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  kombination = [datei]


  for subline in q.stdout.readlines():
# q enthaelt die Zeilen von pdfinfo
    if "Pages" in subline:
      kombination.append(subline)

  kombinationen.append(kombination)


# Jetzt kombinationen in benoetigtes Format bringen:

kombinationen_bereinigt =  []
out_string1 = "[/Title ("
out_string2 = ") /Page "
out_string3 = " /OUT pdfmark\n"
seitenzahl = 1

for kombination in kombinationen:
  dateiname = kombination[0][0:len(kombination[0])-5]

#
# Hier noch dateiname evtl. verwursten
# z. B.
#  lesezeichen = dateiname[0:1]+" "+dateiname[6:8]+"/"+dateiname[1:5]
  lesezeichen = dateiname

  anz_seiten = kombination[1][16:len(kombination[1])-1]
  seitenzahl_str = str(seitenzahl)

  kombination_bereinigt = out_string1+lesezeichen+out_string2+seitenzahl_str+out_string3
  kombinationen_bereinigt.append(kombination_bereinigt)

  seitenzahl += int(anz_seiten)


# Ausgabe ins file
outfile = open("pdfmarks", "w")

for i in kombinationen_bereinigt:
  outfile.write(i)

outfile.close()

# Merge-Befehl absetzen

print "\nFor merging all pdfs execute this (or similar) command (in bash shell):"
print "gs -dBATCH -dNOPAUSE -sPAPERSIZE=A4 -sDEVICE=pdfwrite -sOutputFile=\"all.pdf\" $(ls *pdf ) pdfmarks\n"
2 голосов
/ 07 февраля 2012
Хороший ответ

@ pipitas не решает проблемы с закладками, а также есть вопрос в обсуждении Unix https://unix.stackexchange.com/questions/17065/add-and-edit-bookmarks-to-pdf/31070, где я предлагаю

Если вы все еще придерживаетесь этих сценариев Unix, тогда

  1. извлечение данных закладок, выгруженных из pdftk
  2. написать один дополнительный сценарий для преобразования сброшенных данных закладок в формат pdfmarks, для чего принята команда ghostscript gs.
  3. используйте скрипт gs, чтобы объединить их с pdfmarks

Сценарий уже существует, см. pdf-merge.py из Объединить PDF с PDFTK с закладками?

1 голос
/ 29 июня 2010

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

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

0 голосов
/ 31 октября 2018

Последняя версия pdftk (по крайней мере v2.02) правильно обрабатывает закладки и ссылки:

pdftk file1.pdf file2.pdf cat output merged.pdf
0 голосов
/ 08 декабря 2017

Sejda PDF (который был предложен в один из ответов ) также доступен в виде онлайн-сервиса: https://www.sejda.com/merge-pdf.

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

Шаги для объединения:

  1. Перетащите все файлы PDF на веб-страницу
  2. По умолчанию все существующие закладки сохраняются и будут работать и в объединенном документе .

  3. Опционально, инструмент слияния может создавать оглавление на основе объединяемых документов PDF

Option selected to generated Table of contents for merged PDF documents based on filenames

Merged PDF table of contents

Онлайн-сервис для объединения PDF-файлов можно бесплатно использовать до 30 файлов в час и до 50 Мб / 200 страниц.

Отказ от ответственности: я - разработчик с открытым исходным кодом, работающий над Сейдой.

0 голосов
/ 19 июля 2017

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

...