Wie buche ich ein PDF aus?

10

Ich habe eine PDF-Datei, die in einem Broschürenformat erstellt wurde. Es soll im Querformat auf A4-Papier gedruckt werden. Hier sind zwei Seiten im PDF, die vier Seiten im eigentlichen Buch entsprechen sollten.

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (1)       |      (3)       |
|              |                |
|              |                |
|              |                |
 ------------------------------- 

 -------------------------------
|              |                |
|              |                |
|              |                |
|    (4)       |      (2)       |
|              |                |
|              |                |
|              |                |
 -------------------------------

Die in Klammern gesetzten Nummern entsprechen der Reihenfolge der einzelnen Seiten.

Ich weiß, dass es unter Linux alle möglichen Befehle (pdfbook, pdfnup usw.) gibt (die wahrscheinlich ursprünglich für die Erstellung dieser Broschüre verwendet wurden). Wie buche ich es aus? Das heißt, ich möchte daraus ein PDF-Dokument erstellen, in dem jede einzelne Seite des Endprodukts eine einzelne Seite des PDFs ist, die auf die übliche Weise bestellt wurde.

Bearbeiten

Dank Gilles konnte ich den folgenden Code verwenden:

import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)

    print >> sys.stderr, 'splitting page',i
    print >> sys.stderr, '\tlowerLeft:',p.mediaBox.lowerLeft
    print >> sys.stderr, '\tupperRight:',p.mediaBox.upperRight

    p.mediaBox.upperRight = (ur[0], (bl[1]+ur[1])/2)
    p.mediaBox.lowerLeft = bl

    q.mediaBox.upperRight = ur
    q.mediaBox.lowerLeft = (bl[0], (bl[1]+ur[1])/2)

    if i % 2 == 0:
        output.addPage(p)
        qold = q
    else:
        output.addPage(q)
        output.addPage(qold)
        output.addPage(p)
output.write(sys.stdout)
TSGM
quelle
1
Ich denke , das gehen sollte superuser.com
Adam Zalcman
@AdamZalcman Warum? Er sucht nach einem Linux-Programm
Michael Mrozek
2
Sie können diese Antwort (von Gilles) an Ihr Problem anpassen , dh ein PyPdf-Skript erstellen.
sr_
Sind Sie sicher, dass Sie die Seiten 3 und 4 nicht getauscht haben? Ich habe im Druck gearbeitet; Dieses Layout macht keinen Sinn ...
Wildcard

Antworten:

4

Hier ist ein kleines Python-Skript, das die PyPdf-Bibliothek verwendet , die den Job erledigt. (Abgeleitet von un2up.) Speichern Sie es in einem Skript namens unbook, machen Sie es ausführbar ( chmod +x unbook) und führen Sie es als Filter ( unbook <book.pdf >1up.pdf) aus.

Ich habe dieses Skript auf der Ausgabe von getestet pdfbook --signature=N. Bei einer anderen Methode müssen Sie möglicherweise nicht jede andere Eingabeseite umkehren, und die Seitenreihenfolge kann unterschiedlich sein (dies hängt von der Ausrichtung der Querformat-Seiten ab). Die Seitenanordnung stimmt nicht mit Ihrer Frage überein. Die 13,42 macht für mich keinen Sinn (in einem 4-seitigen Buch sollte 3 neben 2 stehen, nicht neben 1).

#!/usr/bin/env python
import copy, sys
from pyPdf import PdfFileWriter, PdfFileReader
input = PdfFileReader(sys.stdin)
output = PdfFileWriter()
second_half = []
for i in range(0,input.getNumPages()):
    p = input.getPage(i)
    q = copy.copy(p)
    (w, h) = p.mediaBox.upperRight
    p.mediaBox.upperRight = (w/2, h)
    q.mediaBox.upperLeft = (w/2, h)
    if i % 2 == 0:
        p.rotateClockwise(180)
        q.rotateClockwise(180)
        output.addPage(p)
        second_half.append(q)
    else:
        output.addPage(p)
        second_half.append(q)
second_half.reverse()
for q in second_half: output.addPage(q)
output.write(sys.stdout)

Ignorieren Sie alle Verfallswarnungen. Nur die PyPdf-Betreuer müssen sich mit diesen befassen.

Gilles 'SO - hör auf böse zu sein'
quelle
Dies wurde vor einiger Zeit gefragt, aber ich habe Probleme bei der Implementierung Ihrer Lösung. Ich verwende OSX, habe Python und py27-pypdf über MacPorts installiert. Ich habe eine Unbook-Datei erstellt und das Skript kopiert und eingefügt. Wenn Sie den Befehl wie angewiesen ausführen, wird eine neue 1up.pdf-Datei mit 0 Byte erstellt. In meinem Terminal ist kein Fehler oder etwas aufgeführt, aber beim Ausführen des Befehls passiert nichts (ich muss STRG-C ausgeben). Das System hängt nicht und scheint nichts zu tun. Wie kann ich das Problem aufspüren? @ Gilles
TSGM
@TSGM Die wahrscheinlichste Erklärung ist, dass Sie die <vor der Eingabedatei vergessen haben . Wenn Sie wirklich absolut sicher sind, dass Sie den Befehl richtig geschrieben haben, könnte dies ein Fehler in der PyPdf-Bibliothek sein (es hat mich noch nicht gescheitert, aber es könnte passieren).
Gilles 'SO - hör auf böse zu sein'
Das Problem war, dass ich Python über "python unbook <in.pdf> out.pdf" aufrufen sollte. Wie dumm von mir. Außerdem war Ihr Code etwas seltsam (er klebte die Seiten der zweiten Hälfte am Ende fest. Ich habe ihn anscheinend für das Format korrigiert, das ich im ursprünglichen Beitrag geschrieben habe). Ich habe meine ursprüngliche Antwort so bearbeitet, dass sie den Code enthält, den ich schließlich verwendet habe. Außerdem scheinen die Befehle für die Seitengröße falsch zu sein. Das habe ich auch korrigiert. @ Gilles
TSGM
@TSGM Der Code setzt ein Layout von 1 | 4 Vorderseite, 2 | 3 Rückseite voraus, was das übliche Buchlayout ist. Möglicherweise müssen Sie es optimieren, wenn Ihre Seiten anders angeordnet sind. Es wurde in dieser Einstellung vor Ort getestet. Ihr ausdrücklicher Anruf pythonwar mein Fehler: Ich hätte eine Shebang-Linie setzen sollen, fügte ich hinzu.
Gilles 'SO - hör auf böse zu sein'