
Ich habe ein paar E-Books, die von Originalen gescannt wurden. Sie sind so formatiert, dass ein einzelnesPDF-Seiteenthält zweiAktuelle Seiten: eine auf der linken und eine auf der rechten Seite.
Ich möchte jede PDF-Seite programmgesteuert in zwei Hälften aufteilen, sodass die linken 50 % der PDF-Seite 1 zu Seite 1 werden, die rechte Hälfte zu Seite 2 und so weiter für alle Seiten.
Kennt jemand ein Befehlszeilenprogramm oder Skript, das hierbei helfen könnte?
Ausgabe von pdfimages -list -f 1 -l 1 file.pdf
:
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 1921 1561 rgb 3 8 jpeg no 643 0 200 200 200K 2.3%
1 1 stencil 1 1 - 1 1 image no [inline] 0.692 2 - -
1 2 stencil 1 1 - 1 1 image no [inline] 0.722 0.650 - -
1 3 stencil 1 1 - 1 1 image no [inline] 3 3 - -
Zweites PDF:
page num type width height color comp bpc enc interp object ID x-ppi y-ppi size ratio
--------------------------------------------------------------------------------------------
1 0 image 456 625 gray 1 8 jpx yes 251 0 72 72 11.7K 4.2%
Antwort1
Dies sollte funktionieren, es werden pdftk
die Werkzeuge ( und ghostscript
) benötigt.
Ein einfacher Fall:
Schritt eins:Aufteilung in einzelne Seiten
pdftk clpdf.pdf burst
Dadurch werden Dateien erstellt pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf
, eine für jede Seite. Außerdem werden Dateien erstellt doc_data.txt
, die die Seitenabmessungen enthalten.
Schritt zwei:Linke und rechte Halbseiten erstellen
pw=`cat doc_data.txt | grep PageMediaDimensions | head -1 | awk '{print $2}'`
ph=`cat doc_data.txt | grep PageMediaDimensions | head -1 | awk '{print $3}'`
w2=$(( pw / 2 ))
w2px=$(( w2*10 ))
hpx=$(( ph*10 ))
for f in pg_[0-9]*.pdf ; do
lf=left_$f
rf=right_$f
gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${w2} 0]>> setpagedevice" -f ${f}
done
Schritt drei:Links und rechts zusammenführen, um newfile.pdf
eine einseitige PDF-Datei zu erstellen.
ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
pdftk `cat fl` cat output newfile.pdf
Ein allgemeinerer Fall:
Das obige Beispiel geht davon aus, dass alle Seiten gleich groß sind. Die
doc_data.txt
Datei enthält die Größe für jede geteilte Seite. Wenn der Befehlgrep PageMediaDimensions <doc_data.txt | sort | uniq | wc -l
nicht 1 zurückgibt, dann haben die Seiten unterschiedliche Dimensionen und es wird eine zusätzliche Logik benötigt inSchritt zwei.
Wenn die Aufteilung nicht genau 50:50 ist,
w2=$(( pw / 2 ))
ist eine bessere Formel als die im obigen Beispiel verwendete erforderlich.
Dieses zweite Beispiel zeigt, wie dieser allgemeinere Fall behandelt wird.
Schritt eins:geteilt mit pdftk
wie zuvor
Schritt zwei:Erstellen Sie nun drei Dateien, die die Breite und Höhe der einzelnen Seiten sowie einen Standardwert für den Teilungsanteil enthalten, den die linke Seite verwenden wird.
grep PageMediaDimensions <doc_data.txt | awk '{print $2}' > pws.txt
grep PageMediaDimensions <doc_data.txt | awk '{print $3}' > phs.txt
grep PageMediaDimensions <doc_data.txt | awk '{print "0.5"}' > lfrac.txt
Die Datei lfrac.txt
kann manuell bearbeitet werden, wenn Informationen darüber verfügbar sind, wo die verschiedenen Seiten aufgeteilt werden sollen.
Schritt drei:Erstellen Sie nun linke und rechte geteilte Seiten und verwenden Sie dabei unterschiedliche Seitengrößen und (sofern bearbeitet) unterschiedliche Teilungspositionen für die Teilung.
#!/bin/bash
exec 3<pws.txt
exec 4<phs.txt
exec 5<lfrac.txt
for f in pg_[0-9]*.pdf ; do
read <&3 pwloc
read <&4 phloc
read <&5 lfr
wl=`echo "($lfr)"'*'"$pwloc" | bc -l`;wl=`printf "%0.f" $wl`
wr=$(( pwloc - wl ))
lf=left_$f
rf=right_$f
hpx=$(( phloc*10 ))
w2px=$(( wl*10 ))
gs -o ${lf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [0 0]>> setpagedevice" -f ${f}
w2px=$(( wr*10 ))
gs -o ${rf} -sDEVICE=pdfwrite -g${w2px}x${hpx} -c "<</PageOffset [-${wl} 0]>> setpagedevice" -f ${f}
done
Schritt vier:Dies ist derselbe Zusammenführungsschritt wie im vorherigen, einfacheren Beispiel.
ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
pdftk `cat fl` cat output newfile.pdf
Antwort2
Sie können Ihre Auswahl an Werkzeugen erweitern, indem Sie das PDF wie folgt in PostScript konvertieren und dannpstops. Ich bin davon ausgegangen, dass wir von einer A4-Hochformatseite ausgehen, die zwei Seiten zeigt, wie sie aus einem offenen Buch gescannt worden sein könnten, wobei der Buchrücken horizontal durch die Mitte verläuft, etwa so:
Natürlich können Sie die Werte in der folgenden Lösung so ändern, dass sie zu Ihrem genauen Fall passen.
pdf2ps
Sie können dieses PDF mit (das Teil des Ghostscript-Pakets ist) in PostScript konvertieren . Dann pstops
können Sie das Tool aus dem Paket psutils verwenden, um die Seite um die untere linke Ecke nach rechts (im Uhrzeigersinn) zu drehen, sie neu zu skalieren und das Ergebnis nach oben zu verschieben, sodass nur die untere Hälfte eine ganze Seite bedeckt:
Aus derselben Originalseite kann durch ähnliches Drehen, Skalieren und Verschieben eine zweite Seite erstellt werden. Das Ergebnis kann wieder in PDF umgewandelt werden. Mit einem einzigen Befehl kann jede Seite auf zwei neue Seiten gezeichnet werden:
pdf2ps myfile.pdf out.ps
pstops -p a4 '[email protected](1cm,29cm),[email protected](-16cm,29cm)' out.ps new.ps
ps2pdf new.ps new.pdf
Die Syntax wird in der Manpage erklärt. Hier haben wir R
für die Drehung nach rechts, @1.2 zum Skalieren, (x,y) zum Verschieben des Ergebnisses. Das Komma (,) erzeugt aus jeder Originalseite zwei Seiten.
Beachten Sie, dass dadurch die Größe des resultierenden PDFs verdoppelt wird, da jede Seite zweimal vollständig gezeichnet wird, obwohl Sie jedes Mal nur die Hälfte davon sehen.
Antwort3
Antwort4
Vielleicht möchten Sie einen Blick auf Folgendes werfen imagemagick
:
$ convert -resize 1000x1000 /links/www/Salix/pdf/index.pdf a.jpg
$ convert -crop 500x1000+0+0 a.jpg b.jpg
$ convert -crop 500x1000+500+0 a.jpg c.jpg
$ convert c.jpg c.pdf
$ convert b.jpg b.pdf