Подтвердить что ты не робот

Слияние PDF с PDFTK с закладками?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Я знаю, что есть другие способы сделать это уже упомянуто, но с pdftk вы можете взять объединенный PDF файл и добавить к нему закладки, используя функцию pdftk dump_data для создания файла .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/

Ответ 3

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

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

Ответ 4

См. ответ на fooobar.com/questions/172897/.... Я использовал что-то по имени Сейда. Оно работает. Он отлично сочетает закладки. Спасибо @blablatros.

Ответ 5

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

Если вы все еще придерживаетесь этих unix-скриптов, то

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

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

Ответ 6

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

Вот он. Возможно, для окон необходимы некоторые изменения? (извините за комментарии не на английском языке). Просто запустите python script в каталоге, где находятся файлы 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"

Ответ 7

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

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

Ответ 8

Следующий комментарий предназначен для комментария к файлу pdfmerger (fooobar.com/questions/172896/...).

Спасибо за ваш script pdfmerger! Я знаю, что вопрос отмечен как linux, но для обобщения вашего script для Mac OS X требуется 2 вещи:

  • ghostscript gs и
  • команда pdfinfo (которая включена, например, в poppler)

Установите их, получив первый brew (google it, он установлен через некоторую команду curl/ruby-magic ^^), а затем просто:

brew install ghostscript
brew install poppler

ДОБАВИТЬ: ПРОЧИТАТЬ ТЕКСТ-ФАЙЛ С ГЛАВАМИ:

Чтобы расширить свой script. Я использую этот рабочий процесс, главным образом, для книг, доступных в виде разделов-загрузок с веб-сайта редакторов. Текстовый файл, содержащий имена глав, может быть легко сгенерирован. Следующее дополнение к вашему коду дополнительно читает текстовый файл "chapters.txt", содержащий одну строку в pdf для слияния. (Заметьте, я не выполнил никакой проверки количества строк, соответствующих количеству PDF файлов.)

Просто разверните script, заменив следующие строки:

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

pdfdateien = []
kombinationen = []
chapternames = []

for line in c.stdout.readlines():
# c contains all chapter-titles
  chapternames.append(line)

for line in p.stdout.readlines():

и

for index, kombination in enumerate(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
  lesezeichen=chapternames[index][:-1]

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

Ответ 9

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

Ответ 10

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

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

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

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

  • При желании инструмент объединения может создавать оглавление на основе объединенных документов PDF

Опция, выбранная для сгенерированного оглавления для объединенных PDF-документов на основе имен файлов

Объединенное содержание в формате PDF

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

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