Mehrere PDF-Dateien zu einer PDF zusammenführen / konvertieren

1070

Wie kann ich mehrere PDF-Dateien zu einer großen PDF-Datei zusammenführen / konvertieren?

Ich habe Folgendes versucht, aber der Inhalt der Zieldatei war nicht wie erwartet:

convert file1.pdf file2.pdf merged.pdf

Ich benötige eine sehr einfache / grundlegende Befehlszeilenlösung (CLI). Am besten wäre es, wenn ich die Ausgabe des Zusammenführens / Konvertierens direkt in pdf2ps(wie ursprünglich in meiner zuvor gestellten Frage hier versucht: Linux-Piping (konvertieren -> pdf2ps -> lp) ) weiterleiten könnte .

Alkohol
quelle
3
ymmv, aber dies scheint keine so gute Auflösung in der Ausgabedatei zu haben wie pdfunite und es führt auch zu einer Dateigröße, die größer ist als die Ausgabe von pdfunite
sabujp
Wann immer Links durch diese Lösungen erhalten bleiben oder nicht, wird in diesem Beitrag behandelt . Wenn Sie die Links beibehalten möchten (wahrscheinlich zusammen mit anderen Anmerkungen), verwenden Sie pdftk, wenn Sie eine Befehlszeilenschnittstelle wünschen, pdfsam, wenn Sie eine grafische Benutzeroberfläche wünschen, sejda, wenn Sie eine Weboberfläche wünschen.
Clément

Antworten:

1388

In Anbetracht dessen, dass pdfunitePoppler Teil einer höheren Wahrscheinlichkeit ist, installiert zu werden, ist die Verwendung auch einfacher als pdftk:

pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf
Hubert Kario
quelle
20
Es ist schnell, aber es scheint Hyperlinks zu brechen. Siehe blog.dbrgn.ch/2013/8/14/merge-multiple-pdfs
Danilo Bargen
425
Stellen Sie einfach sicher, dass Sie daran denken, out.pdf bereitzustellen, da sonst die letzte Datei in Ihrem Befehl überschrieben wird, seufz.
mlissner
10
Paket für pdfunite ist Poppler-Utils in Debian, aber möglicherweise nicht in alten Debian-Versionen vorhanden.
Jocelyn delalande
16
Kann das nicht empfehlen. Die Größe des resultierenden PDF ist viel zu groß. Zum Beispiel: Pdfunite gibt mir eine 75-MB-Datei, während Ghostscript alles in 1 MB packt.
Torben
64
Sie können pdfunite *.pdf out.pdfFolgendes verwenden: Angenommen, in diesem Verzeichnis ist kein anderes PDF vorhanden, und die Reihenfolge wird durch "*" beibehalten. Wenn es nicht beibehalten wird, wird es mithilfe von Bereichen: Dateiname_ {0..9} .pdf gelöst.
Lepe
548

Probieren Sie das gute Ghostscript aus:

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=merged.pdf mine1.pdf mine2.pdf

oder sogar auf diese Weise für eine verbesserte Version für PDFs mit niedriger Auflösung (danke an Adriano für diesen Hinweis):

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdf

In beiden Fällen ist die Ausgangsauflösung viel höher und besser als bei Verwendung von convert:

convert -density 300x300 -quality 100 mine1.pdf mine2.pdf merged.pdf

Auf diese Weise müssten Sie nichts anderes installieren, sondern arbeiten nur mit dem, was Sie bereits auf Ihrem System installiert haben (zumindest sind beide standardmäßig in meinem Rhel enthalten).

Hoffe das hilft,

UPDATE: Zunächst einmal vielen Dank für all Ihre netten Kommentare! Nur ein Tipp, der für euch vielleicht funktioniert. Nach dem Googeln habe ich einen großartigen Trick gefunden, um die Größe von PDFs zu verkleinern. Ich habe damit ein PDF von 300 MB auf nur 15 MB mit einer akzeptablen Auflösung reduziert! und das alles mit dem guten Ghostscript, hier ist es:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/default -dNOPAUSE -dQUIET -dBATCH -dDetectDuplicateImages -dCompressFonts=true -r150 -sOutputFile=output.pdf input.pdf

Prost!!

Gery
quelle
27
Netter Tipp, gsläuft sehr schnell und komprimiert viel. Die Qualität hat sich jedoch stark verbessert, nachdem ich diesen Parameter verwendet habe:-dPDFSETTINGS=/prepress
Adriano P
3
Ich fand, dass dies -dPDFSETTINGS=/prepressden sehr schönen Effekt hat, zu breite Seiten zu drehen und störende horizontale Bildlaufleisten zu erzwingen.
Robert Smith
24
Fügen Sie die folgende Zeile zu Ihrer hinzu, .bash_profileund Sie haben eine nette Verknüpfung: pdfmerge() { gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=$@ ; }Dies erspart Ihnen einige Eingaben, wenn Sie den Befehl häufig verwenden müssen. Die Verwendung sieht folgendermaßen aus:pdfmerge merged.pdf mine1.pdf mine2.pdf
Torben
2
Ich habe versucht, eine Beschreibung für das Flag -dBATCH zu finden, konnte es aber nicht. Sogar man gs sagt nichts. Aber großartig und ohne zusätzliche Programme!
Michal Gonda
3
Das gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=merged.pdf mine1.pdf mine2.pdfkann auf das gekürzt werden gs -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -o merged.pdf mine1.pdf mine2.pdf. Aus der Dokumentation : "Als praktische Abkürzung können Sie die -oOption gefolgt von der Ausgabedateispezifikation wie oben beschrieben verwenden. Die -oOption legt auch die Optionen -dBATCHund fest -dNOPAUSE. Dies ist eine schnelle Möglichkeit zum Aufrufen ghostscript, um eine oder mehrere Eingabedateien zu konvertieren."
MiniMax
513

Es tut mir leid, ich habe es geschafft, die Antwort selbst mit Google zu finden und ein bisschen Glück :)

Für Interessierte;

Ich habe das pdftk (pdf toolkit) auf unserem Debian-Server installiert und mit dem folgenden Befehl die gewünschte Ausgabe erzielt:

pdftk file1.pdf file2.pdf cat output output.pdf

ODER

gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf file1.pdf file2.pdf file3.pdf ...

Dies kann wiederum direkt in pdf2ps geleitet werden.

Alkohol
quelle
81
Die Verwendung von Ghostscript könnte auch funktionieren: gs -q -sPAPERSIZE=letter -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf in3.pdf ...
Nate Kohl
15
Es ist erwähnenswert, dass pdftk verschlüsselte pdfs zusammenführen kann, während pdfunite nicht
Thomas
3
bietet eine bessere Auflösung mit pdftk im Vergleich zur Konvertierung in Standardoptionen.
Kiran K Telukunta
13
pdftk file1.pdf file2.pdf cat output out.pdfwird die zusammengeführte Datei alsout.pdf
jmiserez
2
pdftkist für EL7-Systeme aufgrund fehlender Abhängigkeit nicht verfügbar libgcj.
ein Codierer
72

Dies ist die einfachste Lösung, wenn Sie mehrere Dateien haben und die Namen nicht einzeln eingeben möchten:

qpdf --empty --pages *.pdf -- out.pdf

SaTa
quelle
2
Dies scheint bei weitem die einfachste zu sein
baxx
1
qpdf scheint Hyperlinks im Dokument zu brechen
David Granqvist
2
Obwohl es schwierig ist, sich zunächst mit den komplexen Optionen vertraut zu machen, ist qpdf ein sehr praktisches und leistungsstarkes Tool. Online-Dokumentation ist hier
Jonathan Holvey
Auf jeden Fall das praktischste!
Glücklicher
54

Außerdem pdfjoin a.pdf b.pdfwird eine neue b-joined.pdfmit den Inhalten von a.pdf und b.pdf erstellt

Rodrigob
quelle
5
Das ist schön und prägnant, bricht aber Hyperlinks.
Heller Stern
3
pdfjoin (pdflatex) schlägt bei Dateien mit vielen Seiten fehl. Fehler beim Zusammenführen mit 1k-Seitendateien.
Mdrozdziel
pdfjoin bricht Anmerkungen oder zusätzliche nicht grafische Elemente
Sabujp
Die Schriftart "URW Palladio L" wurde nach dem PDF-Beitritt zu den Seiten unsichtbar.
v_2e
9
pdfunite funktioniert normalerweise gut, aber wenn dort "Nicht implementierte Funktion: Verschlüsselte Dateien konnten nicht zusammengeführt werden" angezeigt wird, ist pdfjoin eine gute Alternative. Aus irgendeinem Grund beschwert sich pdfjoin nicht über Verschlüsselung.
Calaf
38

Sie können den Befehl convert direkt verwenden.

z.B

convert sub1.pdf sub2.pdf sub3.pdf merged.pdf
Noor
quelle
40
Das ist nicht verlustfrei.
Ben Ruijl
12
Sie können convert -compress lossless sub1.pdf sub2.pdf sub3.pdf merged.pdf, aber die resultierende Dateigröße könnte viel zu groß sein. Ich würde convert -compress jpeg -quality 90 sub1.pdf sub2.pdf sub3.pdf merged.pdfstattdessen vorschlagen .
Arielnmz
21
Dabei wird anscheinend alles in Rasterbilder konvertiert, was definitiv nicht das Beste ist, insbesondere beim Umgang mit textbasierten PDFs.
Flugsaurier
5
Fast eine Kopie dessen, was das OP als nicht funktionierend beschrieben hat
user829755
15
Verwenden Sie die Konvertierung nicht für Postscript- oder PDF-Dateien, es sei denn, Sie wechseln von Vektor zu Raster und kehren niemals zurück. Es ist schwer zu übertreiben, was für eine schlechte Idee das ist.
Markgalassi
32

pdfuniteEs ist in Ordnung, ganze PDFs zusammenzuführen. Wenn Sie beispielsweise die Seiten 2-7 aus Datei1.pdf und die Seiten 1,3,4 aus Datei2.pdf möchten, müssen Sie pdfseparatedie Dateien für jede Seite in separate PDFs aufteilen pdfunite.

An diesem Punkt möchten Sie wahrscheinlich ein Programm mit mehr Optionen. qpdfist das beste Dienstprogramm, das ich zum Bearbeiten von PDFs gefunden habe. pdftkist größer und langsamer und Red Hat / Fedora packen es nicht, weil es von gcj abhängig ist. Andere PDF-Dienstprogramme haben Mono- oder Python-Abhängigkeiten. Ich fand qpdfeine viel kleinere Ausgabedatei als die Verwendung pdfseparateund pdfuniteZusammenstellung von Seiten zu einer 30-seitigen Ausgabe-PDF, 970 kB gegenüber 1.6450 kB. Da es viel mehr Optionen bietet, ist qpdfdie Befehlszeile nicht so einfach. Die ursprüngliche Anforderung zum Zusammenführen von Datei1 und Datei2 kann mit ausgeführt werden

qpdf --empty --pages file1.pdf file2.pdf -- merged.pdf
Skifahrerseite
quelle
2
Soviel dazu. Parabel zum Beispiel wird auch nicht pdftkmehr verpackt, weil es darauf angewiesen ist gcj, dass die Unterstützung meiner Meinung nach eingestellt wurde. Trotz der Suche nach PDF-Manipulationswerkzeugen über habe pacman -Ss pdfich dies verpasst. Danke für diese Antwort! Ich sollte viel mehr Upvotes erhalten, damit es direkt neben Vorschlägen für pdfuniteoder angezeigt wird pdftk.
k.stm
1
Bei meiner Neuinstallation von Linux Mint wurde dies im Terminalfenster ausgeführt, ohne dass Installationen oder Pfadanpassungen erforderlich waren. Nett!
Wallace Kelly
Dies funktionierte perfekt und ergab auch ein klareres zusammengeführtes Dokument als die anderen Befehle, die ich ausprobiert habe. Danke für den Beitrag.
Siwoku Adeola
14

Apache PDFBox http://pdfbox.apache.org/

PDFMerger Diese Anwendung nimmt eine Liste von PDF-Dokumenten und führt sie zusammen, wobei das Ergebnis in einem neuen Dokument gespeichert wird.

Verwendung: java -jar pdfbox-app-xyzjar PDFMerger "Quell-PDF-Dateien (2 ..n)" "Ziel-PDF-Datei"

lumpchen
quelle
11

Verwenden Sie PDF-Tools von Python https://pypi.python.org/pypi/pdftools/1.0.6

Laden Sie die Datei tar.gz herunter, dekomprimieren Sie sie und führen Sie den folgenden Befehl aus

python pdftools-1.1.0/pdfmerge.py -o output.pdf -d file1.pdf file2.pdf file3 

Sie sollten pyhton3 installieren, bevor Sie den obigen Befehl ausführen

Diese Tools unterstützen die folgenden

  • hinzufügen
  • einfügen
  • Entfernen
  • Drehen
  • Teilt
  • Verschmelzen
  • Postleitzahl

Weitere Details finden Sie unter dem folgenden Link und es ist Open Source

https://github.com/MrLeeh/pdftools

Ravikiran Reddy Kotapati
quelle
Dies ist perfekt. Die Verwendung gs(alle oben aufgeführten Varianten), eine einfache Zusammenführung von zwei PDFs, 2 MB und 500 KB, dauerte Minuten und führte zu einer 40 MB-Datei! pdftoolswird sofort mit identischer Dateigröße abgeschlossen.
Supergra
10

Sie können Sejda-Konsole , kostenlos und Open Source verwenden. Entpacke es und starte sejda-console merge -f file1.pdf file2.pdf -o merged.pdf

Es bewahrt Lesezeichen, Linkanmerkungen, Acroformen usw. Es hat tatsächlich eine ganze Reihe von Optionen, mit denen Sie spielen können. Führen sejda-console merge -hSie sie einfach aus , um sie alle anzuzeigen .

Andrea Vacondio
quelle
OMHO das beste Werkzeug, um diese Art von Aufgaben zu erledigen
Mario Ruiz
8

Wenn Sie alle heruntergeladenen Bilder in ein PDF konvertieren möchten, führen Sie sie aus

convert img{0..19}.jpg slides.pdf

Trupti Kini
quelle
6
Verwenden Sie die Konvertierung nicht für Postscript- oder PDF-Dateien, es sei denn, Sie wechseln von Vektor zu Raster und kehren niemals zurück. Es ist schwer zu übertreiben, was für eine schlechte Idee das ist.
Markgalassi
6

Ich stimme der pdfuniteEmpfehlung zu. Ich habe jedoch Argument list too longFehler erhalten, als ich versucht habe,> 2k PDF-Dateien zusammenzuführen.

Ich habe mich für dieses und zwei externe Pakete an Python gewandt: PyPDF2 (um alle PDF-bezogenen Dinge zu erledigen ) und natsort (um eine "natürliche" Art der Dateinamen des Verzeichnisses zu erstellen). Falls dies jemandem helfen kann:

from PyPDF2 import PdfFileMerger
import natsort
import os

DIR = "dir-with-pdfs/"
OUTPUT = "output.pdf"

file_list = filter(lambda f: f.endswith('.pdf'), os.listdir(DIR))
file_list = natsort.natsorted(file_list)

# 'strict' used because of
# https://github.com/mstamy2/PyPDF2/issues/244#issuecomment-206952235
merger = PdfFileMerger(strict=False)

for f_name in file_list:
  f = open(os.path.join(DIR, f_name), "rb")
  merger.append(f)

output = open(OUTPUT, "wb")
merger.write(output)
Greg Sadetsky
quelle
6
"Argumentliste zu lang" zeigt an, dass Sie die zugewiesene Puffergröße der Shell für die Umgebung überschreiten - dies ist eigentlich keine Einschränkung des Tools. In einem solchen Fall kann der Wechsel zu Python zu viel des Guten sein, da Sie nur einen Stapel erstellen können: Suchen Sie den Eingabenamen * .pdf | xargs -P1 -n500 sh -c 'pdfunite "$ @" output- date +%s.pdf' && pdfunite output - *. pdf output.pdf (Dadurch werden Stapel von 500 Dateien erstellt, die seriell verarbeitet werden. Die resultierenden temporären Dateien werden in der richtigen Reihenfolge sortiert und erstellen Sie eine entsprechende Ausgabedatei; Sie müssen die temporären Dateien nach)
enkiv2
4

Hier ist eine Methode, die funktioniert und einfach zu implementieren ist. Dies erfordert sowohl die fpdf- als auch die fpdi- Bibliothek, die hier heruntergeladen werden können:

require('fpdf.php');
require('fpdi.php');

$files = ['doc1.pdf', 'doc2.pdf', 'doc3.pdf'];

$pdf = new FPDI();

foreach ($files as $file) {
    $pdf->setSourceFile($file);
    $tpl = $pdf->importPage(1, '/MediaBox');
    $pdf->addPage();
    $pdf->useTemplate($tpl);
}

$pdf->Output('F','merged.pdf');
Billynoah
quelle
4

Ich bin voreingenommen, einer der Entwickler von PyMuPDF (einer Python-Bindung von MuPDF) zu sein.

Sie können damit einfach machen, was Sie wollen (und vieles mehr). Der Skelettcode funktioniert folgendermaßen:

#-------------------------------------------------
import fitz         # the binding PyMuPDF
fout = fitz.open()  # new PDF for joined output
flist = ["1.pdf", "2.pdf", ...]  # list of filenames to be joined

for f in flist:
    fin = fitz.open(f)  # open an input file
    fout.insertPDF(fin) # append f
    fin.close()

fout.save("joined.pdf")
#-------------------------------------------------

Das ist alles. Es stehen verschiedene Optionen zur Verfügung, um nur Seitenbereiche auszuwählen, ein gemeinsames Inhaltsverzeichnis zu führen, die Seitenreihenfolge umzukehren oder die Seitenrotation zu ändern usw. usw.

Wir sind auf PyPi.

Jorj McKie
quelle
3

Ich mag die Idee von Chasmo, aber ich bevorzuge es, die Vorteile von Dingen wie zu nutzen

convert $(ls *.pdf) ../merged.pdf

Wenn Sie mehrere Quelldateien angeben, werden convertdiese zu einem gemeinsamen PDF zusammengeführt. Dieser Befehl führt alle Dateien mit der .pdfErweiterung im tatsächlichen Verzeichnis in merged.pdfdas übergeordnete Verzeichnis ein .

user3709983
quelle
5
Angesichts der Ähnlichkeit der ursprünglichen Frage scheint dies ein Kommentar und keine Antwort zu sein. Mit etwas mehr Wiederholungen können Sie Kommentare posten . Verwenden Sie bis dahin keine Antworten als Problemumgehung.
Nathan Tuggy
1
@ Silfheed Nein, es beantwortet die Frage! Obwohl die Antwort vielleicht ausführlicher hätte sein sollen.
Peter
7
Verwenden Sie die Konvertierung nicht für Postscript- oder PDF-Dateien, es sei denn, Sie wechseln von Vektor zu Raster und kehren niemals zurück. Es ist schwer zu übertreiben, was für eine schlechte Idee das ist.
Markgalassi
13
Was ist der Sinn der Verwendung $(ls *.pdf)anstelle eines einfachen Platzhalters *.pdf?
Firegurafiku
Zusätzlich ls *.pdfverlieren Sie mit dem Platzhalter die Kontrolle über die Reihenfolge der zusammengeführten Dateien , wenn Sie auf die Antwort @firegurafiku antworten . In einem Beispiel wird die folgende Liste: 1.pdf, 2.pdf, 3.pdf, ..., 10.pdf, ..., 100.pdf tatsächlich wie 1.pdf, 10.pdf, 100 zusammengeführt. pdf, 2.pdf, 3.pdf (aufgrund der standardmäßigen Linux-Art, Dateien zu bestellen - hier finden Sie weitere Details zu diesem Problem - stackoverflow.com/q/22948042/1977012 ).
Egel
0

Obwohl es sich nicht um eine Befehlszeilenlösung handelt, kann es macosBenutzern helfen :

  1. Wählen Sie Ihre PDF-Dateien aus
  2. Klicken Sie mit der rechten Maustaste auf Ihre markierten Dateien
  3. Wählen Sie Schnellaktionen > PDF erstellen
DevonDahon
quelle
0

Sie können die kostenlosen und Open-Source- PDF-Tools verwenden (Haftungsausschluss: Ich bin der Autor davon).

Es ist im Grunde eine Python-Schnittstelle zum Latex pdfpages Paket.

Um PDF-Dateien einzeln zusammenzuführen, können Sie Folgendes ausführen:

pdftools --input-file file1.pdf --input-file file2.pdf --output output.pdf

Um alle PDF-Dateien in einem Verzeichnis zusammenzuführen, können Sie Folgendes ausführen:

pdftools --input-dir ./dir_with_pdfs --output output.pdf
Raffaem
quelle