Wie kann ich mithilfe der Befehlszeile jede PDF-Seite in zwei Seiten aufteilen?

Wie kann ich mithilfe der Befehlszeile jede PDF-Seite in zwei Seiten aufteilen?

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 pdftkdie 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.pdfeine 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:

  1. Das obige Beispiel geht davon aus, dass alle Seiten gleich groß sind. Die doc_data.txtDatei enthält die Größe für jede geteilte Seite. Wenn der Befehl

    grep 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.

  2. 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 pdftkwie 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.txtkann 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:

Original

Natürlich können Sie die Werte in der folgenden Lösung so ändern, dass sie zu Ihrem genauen Fall passen.

pdf2psSie können dieses PDF mit (das Teil des Ghostscript-Pakets ist) in PostScript konvertieren . Dann pstopskö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:

eine Seite

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 Rfü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

Sie fragen ausdrücklich nach einer Lösung für die Befehlszeile – wahrscheinlich, weil Sie nicht jede einzelne Seite auswählen möchten.

Aber wenn es akzeptabel ist, jedes Buch zu öffnen, dann pdfarrangerwird es funktionieren.

Die Größe der PDF-Datei wird dadurch nicht verdoppelt.

Vor dem Teilen Nach der Teilung

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

verwandte Informationen