it-swarm.com.de

PDFs mit PDFTK mit Lesezeichen zusammenführen?

Die Verwendung von pdftk zum Zusammenführen mehrerer PDFs funktioniert gut. Gibt es jedoch eine einfache Möglichkeit, ein Lesezeichen für jedes zusammengeführte PDF zu erstellen?

Ich sehe nichts in den pdftk-Dokumenten, was das betrifft, also denke ich nicht, dass es mit pdftk möglich ist.

Alle unsere zusammengeführten Dateien haben eine Seite. Sie fragen sich also, ob es noch ein anderes Dienstprogramm gibt, das später Lesezeichen hinzufügen kann?

Oder ein anderes auf Linux basierendes PDF-Dienstprogramm, das das Zusammenführen ermöglicht, während für jedes einzelne PDF ein Lesezeichen angegeben wird.

32
Jason

Sie können auch mehrere PDF-Dateien mit Ghostscript zusammenführen. Der große Vorteil dieser Route besteht darin, dass eine Lösung leicht skriptfähig ist und keinen wirklichen Programmieraufwand erfordert:

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

Mit Ghostscript können Sie pdfmark Anweisungen übergeben, die ein Inhaltsverzeichnis sowie Lesezeichen für jede zusätzliche Quelldatei hinzufügen, die in die resultierende PDF-Datei eingefügt wird. Zum Beispiel:

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 [....]

oder

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 [....]

Eine Einführung in das Thema pdfmark finden Sie auch in Thomas Merzs PDFmark Primer .


Edit:
Ich wollte Ihnen ein Beispiel für file-with-pdfmarks-to-generate-a-ToC.ps geben, habe es aber irgendwie vergessen. Hier ist es:

[/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 

Dies würde einen ToC für die ersten 4 Dateien erstellen == die ersten 4 Seiten (da Sie garantieren, dass Ihre Inhaltsstoffdateien für Ihr zusammengeführtes Ausgabe-PDF jeweils 1 Seite umfassen).

  1. Der Teil [/XYZ null null null] stellt sicher, dass sich Ihr Seitenansichtsfenster und die Zoomstufe nicht von der aktuellen ändern, wenn Sie dem Link folgen. (Sie könnten dazu [/XYZ 222 111 2] sagen, wenn Sie ein beliebiges Beispiel wünschen.)
  2. Das Ding /Title (some string you want) bestimmt, welcher Text in der AGB enthalten ist.

Sie können diese Parameter auch direkt zur Ghostscript-Befehlszeile hinzufügen:

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:

Ach ja, und übrigens: Ghostscriptdoesbehält die Lesezeichen bei, wenn Sie damit zwei PDF -Dateien zu einer zusammenführen - pdftk.exe nicht. Verwenden wir den Befehl, der bei meiner ersten Bearbeitung generiert wurde (und verknüpfen effektiv 2 Kopien derselben Datei):

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

Die Datei doublemerged.pdf hat jetzt 2 * 4 = 8 Lesezeichen.

  • Wie erwartet: Die Lesezeichen 1, 2, 3 und 4 verweisen auf die Seiten 1, 2, 3 und 4.
  • Das Problem ist, dass die Lesezeichen 5, 6, 7 und 8 auch auf den Seiten 1, 2, 3 und 4 verlinkt sind.

Der Grund ist, dass die bereits vorhandenen Lesezeichen ihre Linkziele durch absolute Seitenzahlen angesprochen haben. Um dies zu umgehen (und Lesezeichen funktionieren in zusammengeführten Dateien), müssten Lesezeichen generiert werden, die darauf verweisen, Ziele nach benannten Zielen zu verknüpfen (und sicherstellen, dass diese in allen zusammengeführten Dokumenten einheitlich sind).

(Dieser Ansatz funktioniert auch unter Linux, verwenden Sie einfach gs anstelle von gswin32c.)


Blinddarm

Über der Befehlszeile wird [...more Ghostscript options as needed...] als Platzhalter für weitere Optionen verwendet.

Wenn Sie keine anderen Optionen verwenden, wendet Ghostscript die integrierten Standardeinstellungen für verschiedene Parameter an. Dies kann jedoch zu Ergebnissen führen, die möglicherweise nicht Ihren Wünschen entsprechen. Da Ghostscript basierend auf der Eingabe ein völlig neues PDF generiert, bedeutet dies, dass einige der ursprünglichen Objekte möglicherweise geändert werden. Dies gilt für Farbräume und Bildkomprimierungsstufen.

Wie Sie Parameter anwenden, die die ursprünglich eingebetteten Bilder unverändert lassen, erfahren Sie unter SuperUser: "Ghostscript verwenden, aber Bilder nicht erneut verarbeiten" .

40
Kurt Pfeifle

Ich weiß, dass es dafür andere Möglichkeiten gibt, die bereits erwähnt wurden, aber mit pdftk können Sie das zusammengeführte PDF-Dokument nehmen und es mit Lesezeichen versehen, indem Sie mit der pdftk-Funktion dump_data eine .info-Datei der vorhandenen Informationen im PDF erstellen. Anschließend können Sie der .info-Datei Lesezeicheninformationen hinzufügen, indem Sie die folgenden vier Zeilen für jedes Lesezeichen hinzufügen

BookmarkBegin
BookmarkTitle: name
BookmarkLevel: level
BookmarkPageNumber: page number

Verwenden Sie dann den update_info-Aufruf, um die zusammengeführten PDF-Lesezeichen mit denen zu aktualisieren, die Sie in die .info-Datei geschrieben haben. Ich habe einige einfache Funktionen geschrieben, die dies für mich in Autohotkey tun, wenn jemand interessiert ist. Siehe http://www.autohotkey.com/board/topic/98985-scripts-to-merge-pdfs-and-add-bookmarks-with-pdftk/

10
steventaitinger

Diese Antwort finden Sie unter https://stackoverflow.com/a/17781138/547578 . Ich habe etwas namens Sejda benutzt. Es klappt. Es kombiniert die Lesezeichen perfekt. Vielen Dank @blablatros.

5
Fish Monitor

Zum Hinzufügen oder Bearbeiten von PDF-Lesezeichen können Sie JPdfBookmarks verwenden. Es ist ein hervorragendes Tool für Freie Software mit mehreren Betriebssystemen, das ich seit einiger Zeit mit hervorragenden Ergebnissen verwende. Es werden jedoch nur Lesezeichen behandelt, sodass Sie ein anderes Tool benötigen, um Seiten zusammenzuführen oder neu zu ordnen. Zusätzlich zu pdftk schlage ich vor, PDF Split and Merge (gute App, aber seltsame Benutzeroberfläche, vermasselt Lesezeichen aus meiner Erfahrung), PDF-Shuffler (scheint zu arbeiten gut, aber manchmal friert während des Umgangs mit einigen Dateien), oder PdfMod (das beste möglicherweise, da es um das Neuanordnen, Zusammenführen und Behandeln von Lesezeichen geht, obwohl ich nicht in der Lage war, herauszufinden, wie man PDFs in eine bestimmte Seite).

Es tut mir leid, dass ich einige Links nicht angegeben habe. Als Neuling kann ich nur 2 Hyperlinks hinzufügen.

4
castaway

Die gute Antwort von @pipitas löst nicht die perfektionierten Lesezeichenprobleme, und es gibt eine verwandte Frage in der Unix-Diskussion https://unix.stackexchange.com/questions/17065/add-and-edit-bookmarks-to- pdf/31070 , wo ich vorschlage

Wenn Sie sich immer noch an diese Unix-Skripte halten, dann

  1. lesezeichendaten aus pdftk extrahieren
  2. schreiben Sie ein zusätzliches Skript, um abgelegte Lesezeichen-Daten in das pdfmarks-Format zu konvertieren. Der Ghostscript-Befehl gs wird akzeptiert.
  3. verwenden Sie das Skript gs, um sie mit pdfmarks zusammenzuführen

Das Skript existiert bereits, siehe pdf-merge.py aus PDFs mit PDFTK mit Lesezeichen zusammenführen?

2
Larry Cai

Vielleicht ist das Folgende hilfreich. Ich wollte alle pdfs (in_nn.pdf) in einem Verzeichnis zu einer out.pdf zusammenführen, die die Namen der eingegebenen pdfs (in_nn) als ToC enthält. Ich habe ein Python-Skript geschrieben, das die Namen liest und die Seitenzahlen extrahiert und eine Datei mit dem Namen pdfmarks generiert. Das Zusammenführen der Dateien erfolgt dann einfach mit gs. Der genaue Befehl wird vom Skript ausgegeben und muss separat ausgeführt werden (möglicherweise mit einigen Änderungen aufgrund von Anpassungen der Seitengröße oder aufgrund des Betriebssystems).

Hier ist es. Möglicherweise sind einige Änderungen für Windows erforderlich? (Entschuldigung für nicht englischsprachige Kommentare). Führen Sie einfach das Python-Skript in dem Verzeichnis aus, in dem sich die zusammenzuführenden PDFs befinden.

#!/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
pdfmerger

Leider gibt es keine einfache Möglichkeit, dies zu tun. Sie können die Bibliothek verwenden, auf der pdftk direkt aufbaut, und entweder ein Java- oder ein .NET-Programm schreiben, das iText oder iTextSharp verwendet, um Ihre One-Pager zusammenzuführen und die Lesezeichen zu erstellen. Wenn Sie den iText-Weg gehen möchten, gibt es viele Beispiele online oder im iText-Buch (geschrieben vom iText-Autor).

... oder lassen Sie mich wissen, was nicht funktioniert und ich kann Ihnen helfen.

1
khkremer

Das Folgende soll ein Kommentar zur Antwort von pdfmerger sein ( https://stackoverflow.com/a/30524828/3915004 ).

Danke für dein Skript pdfmerger! Ich weiß, dass die Frage als Linux markiert ist, aber um Ihr Skript für Mac OS X zu verallgemeinern, sind zwei Dinge erforderlich:

  • ghostscript gs und
  • den Befehl pdfinfo (der beispielsweise in poppler enthalten ist)

Installieren Sie sie, indem Sie zuerst brew (google it, wird über einen curl/Ruby-magic-Befehl installiert ^^) und dann einfach:

brew install ghostscript
brew install poppler

ADD-ON: LESE TEXT-DATEI MIT KAPITELTITELN:

Erweitern Sie Ihr Skript. Ich verwende diesen Workflow hauptsächlich für Bücher, die als Kapitel-Downloads von der Website der Redaktion erhältlich sind. Eine Textdatei mit den Kapitelnamen kann einfach erstellt werden. Das folgende Add-On zu Ihrem Code liest zusätzlich eine Textdatei 'chapters.txt', die eine Zeile pro PDF zum Zusammenführen enthält. (Beachten Sie, dass ich die Anzahl der Zeilen, die der Anzahl der PDFs entsprechen, nicht überprüft habe.)

Erweitern Sie einfach Ihr Skript, indem Sie die folgenden Zeilen ersetzen:

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():

und

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]
0
fber

Sejda PDF (was in einer der Antworten vorgeschlagen wurde) ist auch als Onlinedienst verfügbar: https://www.sejda.com/merge- pdf .

Dies kann nützlich sein, wenn Sie keine zusätzliche Software installieren und lieber über einen Browser online arbeiten möchten.

Schritte zum Zusammenführen:

  1. Ziehen Sie alle PDF Dateien auf die Webseite und legen Sie sie dort ab
  2. Standardmäßig werden alle vorhandenen Lesezeichen beibehalten und funktionieren auch im zusammengeführten Dokument .

  3. Optional kann das Zusammenführungstool ein Inhaltsverzeichnis auf der Grundlage der PDF -Dokumente erstellen, die kombiniert werden

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

 Merged PDF table of contents

Der Onlinedienst zum Zusammenführen von PDF Dateien kann kostenlos für bis zu 30 Dateien pro Stunde und Dateien mit einer Größe von bis zu 50 MB/200 Seiten verwendet werden.

Haftungsausschluss: Ich bin ein Open-Source-Entwickler, der an Sejda arbeitet.

0
Edi

Es gibt PdfMod . Es verfügt über eine grafische Oberfläche und ermöglicht das manuelle Hinzufügen von Lesezeichen. Auch wenn Sie ein PDF bearbeiten, das bereits mit Lesezeichen versehen ist, werden diese automatisch aktualisiert, um auf die richtigen Seiten zu verweisen.

0
Caio S.

Die aktuelle Version von pdftk (mindestens v2.02) verarbeitet Lesezeichen und Links korrekt:

pdftk file1.pdf file2.pdf cat output merged.pdf
0
rriemann