Wie kann ich jede PDF-Seite über die Befehlszeile in zwei Seiten aufteilen?

8

Ich habe ein paar E-Books von Originalen gescannt. Sie sind so formatiert, dass eine einzelne PDF-Seite zwei tatsächliche Seiten enthält : eine links und eine rechts.

Ich möchte jede PDF-Seite programmgesteuert in zwei Teile aufteilen, sodass die linken 50% der PDF-Seite 1 zu Seite 1 und die rechte zu Seite 2 usw. für alle Seiten werden.

Kennt jemand ein Befehlszeilenprogramm oder ein Skript, das dabei 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%
Philip Kirkbride
quelle
In der Vergangenheit habe ich erfolgreich ein Befehlszeilentool "mutool" verwendet, um PDF-Dateien zu extrahieren / aufzuteilen. Es ist Teil des mupdf-Pakets (siehe: mupdf.com). Ich weiß nicht, ob es in diesem Fall für Sie funktionieren wird. Soweit ich die obige Ausgabe von PDF-Bildern verstehe, scheinen Ihre PDF-Dateien hauptsächlich aus einem einzelnen großen JPEG-Bild zu bestehen (oder sind ein Wrapper um dieses) ...
Robb W.

Antworten:

11

Dies sollte funktionieren, es benötigt pdftkTool (und ghostscript).

Ein einfacher Fall:

Erster Schritt: In einzelne Seiten aufteilen

 pdftk clpdf.pdf burst

Dadurch werden Dateien erstellt pg_0001.pdf, pg_0002.pdf, ... pg_NNNN.pdf, eine für jede Seite. Es werden auch doc_data.txtSeitenabmessungen erstellt.

Schritt zwei: Erstellen Sie linke und rechte halbe Seiten

  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 3: Führen Sie links und rechts zusammen, um eine newfile.pdfeinzelne Seite als PDF zu erstellen .

  ls -1 [lr]*_[0-9]*pdf | sort -n -k3 -t_ > fl
  pdftk `cat fl`  cat output newfile.pdf 

Ein allgemeinerer Fall:

  1. Im obigen Beispiel wird davon ausgegangen, 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

    Gibt nicht 1 zurück, dann haben die Seiten unterschiedliche Abmessungen und in Schritt 2 ist eine zusätzliche Logik erforderlich .

  2. Wenn die Aufteilung nicht genau 50:50 beträgt, wird eine bessere Formel als w2=$(( pw / 2 ))im obigen Beispiel benötigt.

Dieses zweite Beispiel zeigt, wie mit diesem allgemeineren Fall umgegangen wird.

Erster Schritt: Teilen Sie mit pdftkwie zuvor

Schritt 2: Erstellen Sie nun drei Dateien, die die Breite und Höhe jeder Seite und einen Standardwert für den Bruchteil der Teilung enthalten, den die linke Seite verwendet.

  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 von Hand bearbeitet werden, wenn Informationen zum Teilen verschiedener Seiten verfügbar sind.

Schritt 3: Erstellen Sie nun linke und rechte geteilte Seiten mit den verschiedenen Seitengrößen und (falls bearbeitet) verschiedenen Bruchstellen 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 4: Dies ist der gleiche 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 
Chris Hill
quelle
Wow das ist beeindruckend, Chris, vielen Dank! Ich habe auf Fedora festgestellt, dass pdftk nicht verfügbar ist, also habe ich Tools von poppler-utils verwendet: pdfseparate clpdf.pdf pg_%04d.pdfundpdfunite $(cat fl) newfile.pdf
hnasarat
Ich habe gerade festgestellt, dass dies die PDF-Dateigröße verdoppelt. Es scheint, dass jede Seite dupliziert wird, nur die Hälfte der Daten ist unsichtbar! Ich frage mich, wie ich das beheben soll ...
hnasarat
4

Sie können Ihre Auswahl an Tools erweitern, indem Sie das PDF wie folgt in PostScript konvertieren und dann pstops verwenden . Ich habe angenommen, wir beginnen mit einer A4-Porträtseite, die zwei Seiten zeigt, wie sie möglicherweise aus einem offenen Buch gescannt wurden, wobei der Rücken horizontal durch die Mitte verläuft:

Original

Natürlich können Sie die Werte in der folgenden Lösung an Ihren genauen Fall anpassen.

Sie können dieses PDF mit pdf2ps(das Teil des Ghostscript-Pakets ist) in PostScript konvertieren . Dann kann das Werkzeug pstopsaus Paket psutils verwendet werden, um die Seite nach rechts (im Uhrzeigersinn) um die untere linke Ecke zu drehen, neu zu skalieren und das Ergebnis nach oben zu verschieben, sodass nur die untere Hälfte eine ganze Seite bedeckt:

eine Seite

Eine zweite Seite kann aus derselben Originalseite durch eine ähnliche Drehung, Skalierung und Übersetzung erstellt werden. Das Ergebnis kann wieder in PDF konvertiert werden. Ein einzelner Befehl kann jede Seite auf zwei neue Seiten zeichnen:

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 müssen wir Rnach rechts drehen, @ 1.2 skalieren, (x, y), um das Ergebnis zu verschieben. Das Komma (,) erzeugt 2 Seiten von jeder Originalseite.

Beachten Sie, dass dies die Größe des resultierenden PDFs verdoppelt, da jede Seite zweimal vollständig gezeichnet wird, obwohl Sie jedes Mal nur die Hälfte davon sehen.

meuh
quelle
3

Sie wollen Libpoppler, genauer gesagt das pdfimagesWerkzeug darin. Es ist freie Software, wird die Bilder aus dem PDF extrahieren. Wenn die PDF-Datei gescannte Bilder enthält, sind diese nicht immer um einige Grad versetzt. Wenn die Seite zwei Bilder enthält, eines für jede gescannte Seite, wird es einfach. Wenn nicht, müssen Sie sie manuell ausschneiden (verschmutzen) oder ImageMagick verwenden, um sie zu teilen.

http://poppler.freedesktop.org/

http://en.wikipedia.org/wiki/Pdfimages

Entnommen aus dem Stackoverflow .

thecarpy
quelle
2

Vielleicht möchten Sie sich Folgendes ansehen 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
Ljm Dullaart
quelle
1

Ich schlage PDFjam und sein Tochter-Skript PDFjoin vor. Zuerst die linke Seite zuschneiden und als left.pdf speichern und dann die rechte Seite zuschneiden und als right.pdf speichern und dann einzelne Seiten der beiden Dateien zusammenführen. Sie können die Beispiele auf der Seite als Inspiration lesen. Wenn Ihnen das zu einfach ist, können Sie die Ghostscript-Route wählen, aber dann müssen Sie einige Pixel rechnen, externe Seiten zählen und einen letzten Concat usw. durchführen.

Gehen Sie nicht den JPG-Weg - Sie werden verrückte Dateien aufblähen und Artefakte erzeugen.

Nothingismagick
quelle
0

PDFcreator verfügt über ein COM-Plugin, mit dem Sie möglicherweise kommunizieren können. Sie benötigen jedoch die "Plus" -Version, die 10 US-Dollar pro Jahr kostet.

ZZTest
quelle