Linux-basiertes Tool zum Aufteilen von PDFs auf mehrere Seiten

13790
womble

Ich habe eine Reihe von PDF-Dateien, die auf einer einzigen PDF-Seite zwei "echte" Seiten erzeugt haben. Ich möchte diese in zwei Hälften schneiden und jede Hälfte auf eine eigene Seite legen. Im Wesentlichen brauche ich etwas, das genau das Gegenteil von pdfnup(oder psnup) hat. Google und apt-cache search geben mir keine Liebe.

Plattform ist Linux, bevorzugt Open Source. Da ich einen großen Haufen davon habe, um etwas zu tun, das in Skripts geschrieben werden kann (im Gegensatz zu einer grafischen Benutzeroberfläche), wäre es nett, also kann ich ihm einfach eine Liste davon geben und es wegschmeißen.

Ein vorbestehendes Skript ist auch nicht die einzige Option. Wenn es Beispielcode gibt, um PDFs auf ähnliche Weise mit einer Bibliothek eines Drittanbieters zu bearbeiten, kann ich ihn wahrscheinlich hacken, um das zu tun, was ich will.

15
Mögliches Duplikat von [Wie kann ich die Seiten eines PDFs in der Mitte aufteilen?] (Http://superuser.com/questions/235074/how-can-i-split-a-pdfs-pages-down-the-middle) Skippy le Grand Gourou vor 8 Jahren 0

6 Antworten auf die Frage

22
Kurt Pfeifle

Sie können dies mit Hilfe von Ghostscript lösen. pdftkalleine kann das nicht (nach bestem Wissen). Ich gebe Ihnen die Befehlszeilenschritte, um dies manuell durchzuführen. Es ist leicht, dies als Prozedur zu skizzieren, auch mit unterschiedlichen Parametern für Seitengrößen und Seitennummern. Aber du hast gesagt, dass du das selbst machen kannst ;-)

So lösen Sie dieses Problem mit Hilfe von Ghostscript ...

... und zum Spaß habe ich es kürzlich nicht mit einer Eingabedatei gemacht, die "Double-Up" -Seiten enthält, sondern eine mit "Höhen". Die Antwort für diesen Fall können Sie hier lesen .

Ihr Fall ist noch einfacher. Sie scheinen etwas Ähnliches zu haben:

+------------+------------+ ^ | | | | | 1 | 2 | | | | | 595 pt | | | | | | | | | | | | +------------+------------+ v ^ fold v +------------+------------+ ^ | | | | | 3 | 4 | | | | | 595 pt | | | | | | | | | | | | +------------+------------+ v <---------- 842 pt --------> 

Sie möchten 1 PDF mit 4 Seiten erstellen, von denen jede die Größe 421 x 595 pt hat.

Erster Schritt

Zuerst extrahieren wir die linken Abschnitte von jeder der Eingabeseiten:

gs \ -o left-sections.pdf \ -sDEVICE=pdfwrite \ -g4210x5950 \ -c "<</PageOffset [0 0]>> setpagedevice" \ -f double-page-input.pdf 

Was haben diese Parameter gemacht?

Zuerst wissen Sie, dass in PDF 1 Zoll == 72 Punkte . Dann ist der Rest:

  • -o ...............:Benennt die Ausgabedatei. Implizit auch verwendet -dBATCH -dNOPAUSE -dSAFER.
  • -sDEVICE=pdfwrite : wir wollen PDF als Ausgabeformat.
  • -g................:legt die Größe des Ausgabemediums in Pixel fest. Die Standardauflösung von pdfwrite beträgt 720 dpi. Multiplizieren Sie daher mit 10, um eine Übereinstimmung für PageOffset zu erhalten.
  • -c "..............:bittet Ghostscript, das angegebene PostScript-Code-Snippet unmittelbar vor der Haupteingabedatei (die gefolgt werden muss -f) zu verarbeiten.
  • <</PageOffset ....:Legt die Verschiebung des Seitenbilds auf dem Medium fest. (Für linke Seiten hat die Verschiebung natürlich [0 0]keine wirklichen Auswirkungen.)
  • -f ...............: Diese Eingabedatei verarbeiten.

Welches Ergebnis hat der letzte Befehl erzielt?

Dieses:

Output file: left-sections.pdf, page 1 +------------+ ^ | | | | 1 | | | |595 pt | | | | | | | | | +------------+ v  Output file: left-sections.pdf, page 2 +------------+ ^ | | | | 3 | | | |595 pt | | | | | | | | | +------------+ v <-- 421 pt --> 

Zweiter Schritt

Als nächstes die richtigen Abschnitte:

gs \ -o right-sections.pdf \ -sDEVICE=pdfwrite \ -g4210x5950 \ -c "<</PageOffset [-421 0]>> setpagedevice" \ -f double-page-input.pdf 

Beachten Sie den negativen Versatz, da wir die Seite nach links verschieben, während der Anzeigebereich unbewegt bleibt.

Ergebnis:

Output file: right-sections.pdf, page 1 +------------+ ^ | | | | 2 | | | |595 pt | | | | | | | | | +------------+ v  Output file: right-sections.pdf, page 2 +------------+ ^ | | | | 4 | | | |595 pt | | | | | | | | | +------------+ v <-- 421 pt --> 

Letzter Schritt

Jetzt fassen wir die Seiten in einer Datei zusammen. Wir könnten das auch mit Ghostscript machen, aber wir werden es verwenden pdftk, weil es für diesen Job schneller ist:

pdftk \ A=right-sections.pdf \ B=left-sections.pdf \ shuffle \ output single-pages-output.pdf verbose 

Erledigt. Hier ist das gewünschte Ergebnis. 4 verschiedene Seiten im Format 421x595 pt.

Ergebnis:

+------------+ +------------+ +------------+ +------------+ ^ | | | | | | | | | | 1 | | 2 | | 3 | | 4 | | | | | | | | | |5595 pt | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ v <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> 
@Unknown: Danke für das Downvoting! Möchten Sie bitte einen Kommentar schreiben, der einen Grund dafür angibt? Kurt Pfeifle vor 13 Jahren 0
+1 für hervorragende Verwendung von ASCII-Grafiken und sehr klare Anweisungen. Nur weil ich ein CLI n00b bin, entkommen die Zeilen, so dass es einfacher zu lesen ist, richtig? Journeyman Geek vor 13 Jahren 0
@mullhausen: Danke für die Korrektur des Tippfehlers (`421` ->` -421`). ;-) Kurt Pfeifle vor 12 Jahren 0
5
Philipp Wendler

Es gibt ein Tool pdfposter, mit dem Sie PDFs mit mehreren Seiten für eine Eingabeseite erstellen können (Kacheln oder Zerlegen der Seiten). Es ähnelt dem Tool poster, das für PostScript-Dateien dasselbe tut.

pdfposter verarbeitet nicht den überlappenden Inhalt an den Rändern, um die Montage der Poster zu vereinfachen. Es ist jedoch ein Perl-Skript, daher ist es ziemlich einfach hinzuzufügen. Matthias Urlichs vor 11 Jahren 0
2
womble

Also, nach viel mehr auf der Suche (es scheint, dass „PDF Schnitt Seiten“ ist eine weit bessere Suche), fand ich ein kleines Skript aufgerufen, unpnupdas verwendet poster, PDF / PS - Konvertierung, und pdftkgenau das zu tun, was ich brauche. Es ist zwar ein bisschen weit, aber es ist den anderen Methoden, die ich gefunden habe, weit überlegen (z. B. mit Imagemagick), da es die Seiten nicht rastert, bevor sie ausgespuckt werden.

Für den Fall, dass mobileread aus irgendeinem Grund wegfällt, lautet der Kern des Skripts (lizenziert unter der GPLv2 oder später von Harald Hackenberg <hackenberggmx.at>) wie folgt:

pdftk "$1" burst for file in pg*.pdf; do pdftops -eps $file poster -v -pA4 -mA5 -c0% `basename $file .pdf`.eps > `basename $file .pdf`.tps epstopdf `basename $file .pdf`.tps done pdftk pg*.pdf cat output ../`basename $1 .pdf`_unpnuped.pdf 
Ich muss es lieben, wenn Menschen ihre eigenen Fragen beantworten. Wenn Sie dies jedoch mit einer grafischen Benutzeroberfläche tun mussten, insbesondere wenn die Seitengrößen nicht gleich groß sind oder Sie beide Seiten weiter beschneiden möchten, besuchen Sie Briss: http://briss.sourceforge.net frabjous vor 14 Jahren 1
Sie sollten in der Lage sein, mit PDFTK selbst zu tun, ohne alle Konvertierungen. CarlF vor 14 Jahren 0
@ CarlF: Ich dachte, das wäre möglich, aber ich sehe auf der PDFTK-Manpage nichts, um den Inhalt der Seiten zu manipulieren. Hast du Hinweise für mich? womble vor 14 Jahren 0
@ frabjous: Was ist daran falsch, deine eigenen Fragen zu beantworten? Kurt Pfeifle vor 14 Jahren 0
@womble: Deine Konvertierungen gehen über PS / EPS. Dies führt zwangsläufig zu Qualitätsverlusten (eingebettete Schriftarten, Transparenzen usw.). Mein Vorschlag vermeidet die riskante "PDF => EPS => PDF" - Route und geht den sicheren Weg "PDF => PDF => PDF". Kurt Pfeifle vor 14 Jahren 1
@pipitas. Nichts. Ich war nicht sarkastisch, ich liebe es wirklich. frabjous vor 14 Jahren 0
Ich habe pdfsam, jpdf probiert, die Lösung mit perl CAM: PDF und auch die mit GhostScript .... allerdings kein Erfolg. Danach habe ich es mit Briss ausprobiert, und es war ganz einfach und in wenigen Minuten war alles fertig ... also, Daumen hoch! Rostislav Stribrny vor 11 Jahren 0
@frabjous Wenn Sie mit briss vertraut sind, schreiben Sie bitte eine Antwort auf diese Frage. 把友情留在无盐 vor 9 Jahren 0
@soubunmei b / c briss ist eine Gui-App, und damit würde die Frage nicht beantwortet frabjous vor 9 Jahren 0
2
Chris Thorman

Die Antwort von Kurt Pfeifle fand ich sehr hilfreich für meine ähnliche Situation. Ich dachte, ich könnte meine Modifikation der Lösung mit anderen teilen ...

Ich hatte auch ein gescanntes PDF mit 2 Seiten pro Blatt. Es war ein 11 x 8,5-Zoll-Scan einer Broschüre mit Sattelheftung, die beim Scannen zunächst geheftet wurde. PDF-Seite 1 = hintere und vordere Abdeckung; PDF-Seite 2 = Seiten 2 und 3 usw. Dies lässt sich gut auf dem Bildschirm anzeigen, aber Sie können es nicht drucken und dann heften, um weitere Exemplare der Broschüre zu erstellen.

Ich musste es auf einem Duplex-Kopierer ausdrucken können; dh es wird wieder in eine "auferlegte" PDF-Datei umgewandelt, die zum Drucken bereit ist. Also habe ich mit Kurts Lösung dieses (ähm) "Ein-Liner" erstellt, um es wieder in der richtigen Seitenreihenfolge in halbe Seiten umzuwandeln. Es funktioniert für jede Höhe und Breite und auch für eine beliebige Anzahl von Seiten. In meinem Fall hatte ich ein 40-seitiges Booklet (20 gescannte Seiten in der PDF-Datei).

HEIGHT=8.5 WIDTH=11 ORIG_FILE_PATH="original.pdf" \ count=$(set -xe; \ gs -o left.pdf -sDEVICE=pdfwrite \ -g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \ -c "<</PageOffset [0 0]>> setpagedevice" \ -f "$ORIG_FILE_PATH" >/dev/null; \ gs -o right.pdf -sDEVICE=pdfwrite \ -g$(perl -e "print(($WIDTH / 2) * 720)")x$(perl -e "print($HEIGHT * 720)") \ -c "<</PageOffset [-$(perl -e "print(($WIDTH / 2) * 72)") 0]>> setpagedevice" \ -f "$ORIG_FILE_PATH" | grep Page | wc -l ); \ echo '>>>>>' Re-ordering $count pages...; \ (set -xe; pdftk A=right.pdf B=left.pdf cat \ A1 `set +xe; for x in $(seq 2 $count); do echo B$x A$x; done` B1 \ output ordered.pdf); \ echo "Done. See ordered.pdf" 

Sie müssen nur die ersten Parameter in diesem Befehl ändern, um HEIGHT und WIDTH und ORIG_FILE_PATH anzugeben. Der Rest des Befehls berechnet die verschiedenen Größen und ruft zweimal gs auf, dann pdftk. Es werden sogar die Seiten in Ihrem Scan gezählt und dann die korrekte Sortierspezifikation erstellt (für das Szenario, das ich gegeben habe).

Es gibt einige Fortschritte bezüglich dessen, was es tut, was folgendermaßen aussehen wird:

+++ perl -e 'print((11 / 2) * 720)' +++ perl -e 'print(8.5 * 720)' ++ gs -o left.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [0 0]>> setpagedevice' -f original.pdf ++ wc -l ++ grep Page +++ perl -e 'print((11 / 2) * 720)' +++ perl -e 'print(8.5 * 720)' +++ perl -e 'print((11 / 2) * 72)' ++ gs -o right.pdf -sDEVICE=pdfwrite -g3960x6120 -c '<</PageOffset [-396 0]>> setpagedevice' -f original.pdf >>>>> Re-ordering 20 pages... ++ set +xe + pdftk A=right.pdf B=left.pdf cat A1 B2 A2 B3 A3 B4 A4 B5 A5 B6 A6 B7 A7 B8 A8 B9 A9 B10 A10 B11 A11 B12 A12 B13 A13 B14 A14 B15 A15 B16 A16 B17 A17 B18 A18 B19 A19 B20 A20 B1 output ordered.pdf Done. See ordered.pdf 

Um die Seitenaufstellung zu erhalten, die Sie für eine gedruckte Broschüre benötigen, "drucken" Sie bestell.pdf auf einer benutzerdefinierten Seitengröße genau der Größe, die Sie benötigen (in meinem Beispiel 5,5 x 8,5), und senden sie an eine Broschürenherstellung "Tool (in meinem Fall habe ich Christoph Vogelbuschs Create Booklet for Mac von http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html verwendet ).

Die resultierende PDF-Datei wird jetzt mit 2 Seiten pro Blatt auf die ursprüngliche Seitengröße von 11 x 8,5 zurückgesetzt. Die Bestellung erfolgt jedoch so, dass Sie sie doppelseitig, mit einer Kante mit kurzer Kante und mit Voilà drucken können! Sie haben einen Ausdruck, den Sie fotokopieren und falten sowie Sattelheftungen erstellen können, um das Originalheft wiederzugeben, ohne das Original zu zerlegen (oder es sogar zu sehen).

Hoffe das hilft jemandem!

-c

1
Louis

Basierend auf der obigen Antwort von piptas :

Unter Windows, zum Aufteilen von PDFs im Letter-Format mit einem einzigen Titelbild am Anfang, funktionierte das Folgende gut für mich (beachten Sie die Verwendung von [-612 0] im zweiten Schritt, ein positiver Wert erzeugte leere Seiten, da sie in die falsche Richtung schoben .)

gswin32c -o left-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Beachten Sie die Verwendung, mit -dFirstPage=2der gs auf Seite 2 mit der Verarbeitung beginnt.

gswin32c -o right-sections.pdf -sDEVICE=pdfwrite -dFirstPage=2 -g6120x7920 -c "<</PageOffset [-612 0]>> setpagedevice" -f input.pdf

Auf diese Weise werden rechte Abschnitte.pdf erstellt. Und nun das Titelbild:

gswin32c -o cover.pdf -sDEVICE=pdfwrite -dLastPage=1 -g6120x7920 -c "<</PageOffset [0 0]>> setpagedevice" -f input.pdf

Da ich nicht mit pdftk unter Verwendung der manuellen Seiteneingabe zusammenführen wollte, teile ich den linken und den rechten Abschnitt in separate PDF-Dateien in einem neuen Verzeichnis auf.

mkdir input_file copy cover.pdf input_file\0000.pdf pdftk left-sections.pdf burst output input_file\%04d_A.pdf pdftk right-sections.pdf burst output input_file\%04d_B.pdf 

Dann füge ich die PDF-Dateien in diesem Verzeichnis in alphabetischer Reihenfolge hinzu (und glücklicherweise bedeutet das, dass sie in der richtigen Reihenfolge sortiert sind!). Außerdem führe ich das Ergebnis erneut über Ghostscript aus, um "Warnung: Generationsnummer außerhalb des Bereichs von 0..65535" zu beheben 0. " Fehler, die von pdftk erzeugt wurden und von Ghostscript als "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" bezeichnet wurden. Außerdem wurde die Dateigröße bei meiner Verwendung halbiert. Mit einem 4,5-MB-Original betrug das Ergebnis von pdftk 6,7 MB, und die Wiederaufarbeitung von gswin32c reduzierte sich auf 3,2 MB.

pdftk input_file\*.pdf cat output input_temp.pdf gswin32c -o final_output.pdf -sDEVICE=pdfwrite -f input_temp.pdf 

Und wir sind fertig! Sie können den Ordner input_file, cover.pdf, input_temp.pdf, right_sections.pdf und left_sections.pdf löschen. ;-)

1
mulllhausen

Wenn Sie nur die pdfs auf der linken Seite in einem Dokument und die pdfs auf der rechten Seite in einem Dokument ausgeben müssen, wird das folgende Skript, das auf der Antwort von Kurt Pfeifle basiert, den Trick erfüllen (funktioniert für jede Höhe und Höhe) Breite):

$ cat split.sh #!/bin/bash   dims=$(pdfinfo "$1" | grep -i "page size:" | cut -d ":" -f2)  width=$(echo "$dims" | cut -d " " -f7)  height=$(echo "$dims" | cut -d " " -f9)  half_width=$(echo "$width * 0.5" | bc -l | cut -d "." -f1)  half_widthtt=$(echo "$width * 5" | bc -l | cut -d "." -f1)  heighttt=$(echo "$height * 10" | bc -l | cut -d "." -f1)   echo "pdf $1 has height $height and width $width"   gs -o "left-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [0 0]>> setpagedevice" -f "$1" gs -o "right-$1" -sDEVICE=pdfwrite -g"$half_widthtt"x"$heighttt" -c "<</PageOffset [-$half_width 0]>> setpagedevice" -f "$1" 

dann führe es so aus:

$ ./split.sh thepdftosplit.pdf