Strumento basato su Linux per tagliare i PDF in più pagine

Ho un sacco di file PDF che sono stati prodotti due pagine "vere" in una singola pagina PDF; Vorrei tagliarle a metà e mettere metà su una pagina separata. In sostanza, ho bisogno di qualcosa che sia l'esatto contrario di pdfnup (o psnup ). Google e la ricerca apt-cache mi stanno senza amore.

La piattaforma è Linux, preferita da open source; poichè ho una grande quantità di questi per fare qualcosa che può essere scritto (al contrario di una GUI) sarebbe bello, quindi posso solo dare un elenco di loro e farlo masticare via.

Uno script preesistente non è l'unica opzione; se esiste un codice di esempio per manipolare i PDF in modo simile con una libreria di terze parti, probabilmente lo canccherò nel fare quello che voglio.

Puoi risolvere questo problema con l'aiuto di Ghostscript. pdftk sola non può farlo (al meglio della mia conoscenza). Ti darò i passi della row di command per farlo manualmente. Sarà facile scriverlo come procedura, anche con diversi parametri per le size delle pagine ei numbers di pagina. Ma tu hai detto che puoi farlo 😉

Come risolvere questo problema con l'aiuto di Ghostscript …

… e per il suo divertimento, l'ho recentemente fatto non con un file di input con pagine "doppio", ma uno con "treble-up". Qui puoi leggere la risposta per questo caso.

Il tuo caso è ancora più semplice. Sembra che tu abbia qualcosa di simile a questo:

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

Si desidera creare un PDF con 4 pagine, ognuna delle quali ha size di 421 pt x 595 pt.

Primo passo

Per prima cosa estrarre le sezioni di sinistra da ciascuna delle pagine di input:

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

Cosa hanno fatto questi parametri?

In primo luogo, sappiate che in PDF 1 pollice == 72 punti . Poi il resto è:

  • -o ...............: File di output dei nomi. Implicitamente utilizza anche -dBATCH -dNOPAUSE -dSAFER .
  • -sDEVICE=pdfwrite : vogliamo PDF come formato di output.
  • -g................: impostare le size del supporto di output in pixel. la risoluzione predefinita di pdfwrite è di 720 dpi. Quindi moltiplicare per 10 per get una corrispondenza per PageOffset.
  • -c "..............: chiede a Ghostscript di elaborare il frammento di codice PostScript appena prima del file di input principale (che deve seguire con -f ).
  • <</PageOffset ....: spostare l'image di pagina sul supporto. (Certo, per le pagine di sinistra lo spostamento di [0 0] non ha alcun effetto reale.)
  • -f ...............: elaborare questo file di input.

Quale risultato ha raggiunto l'ultimo command?

Questo:

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

Secondo passo

Successivamente, le sezioni giuste:

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

Notare l'offset negativo dal momento che stiamo spostando la pagina a sinistra mantenendo la zona di visualizzazione stazionaria.

Risultato:

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

Ultimo passo

Ora combinare le pagine in un unico file. Potremmo farlo anche con ghostscript, ma useremo invece pdftk , perché è più veloce per questo lavoro:

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

Fatto. Ecco il risultato desiderato. 4 pagine diverse, size 421×595 pt.

Risultato:

 +------------+ +------------+ +------------+ +------------+ ^ | | | | | | | | | | 1 | | 2 | | 3 | | 4 | | | | | | | | | |5595 pt | | | | | | | | | | | | | | | | | | | | | | | | | | | +------------+ +------------+ +------------+ +------------+ v <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> <-- 421 pt --> 

C'è un pdfposter per strumenti che può essere utilizzato per creare PDF con più pagine per una pagina di input (piastrelle o tagliare le pagine). È simile al poster dell'utensile, che fa lo stesso per i file PostScript.

Quindi, dopo molto più ricerca (sembra che "pagine di taglio PDF" è una ricerca molto migliore) ho trovato un piccolo script chiamato unpnup che usa poster , conversione PDF / PS e pdftk per fare esattamente quello di cui ho bisogno. È un po 'più in giro, ma è molto superiore agli altri methods che ho trovato (come ad esempio l'utilizzo di imagemagick) perché non rasterizza le pagine prima di sputarle.

Proprio nel caso in cui mobileread andrà via per qualche motivo, il nucleo dello script (concesso sotto licenza sotto il GPLv2 o successivo da Harald Hackenberg <hackenberggmx.at> ) è il seguente:

 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 

Ho trovato la risposta di Kurt Pfeifle per essere molto disponibile per la mia situazione simile. Ho pensato di condividere la mia modifica della soluzione con gli altri …

Ho anche avuto un PDF scansionato che aveva 2 pagine su each foglio. È stata una scansione di 11 x 8,5 pollici di un libretto cucito a sella che è stato lasciato tagliato quando è stato scansionato in origine: PDF pagina 1 = copertina posteriore e frontale; PDF pagina 2 = pagine 2 e 3 ecc. Questo si legge benissimo sullo schermo ma non è ansible printingrlo e poi raggruppare per creare più copie del libretto.

Ho dovuto poterlo printingre su una copiatrice duplex; vale a dire tornare indietro in un PDF "imposto", pronto per la printing. Quindi usando la soluzione di Kurt, ho fatto questo (ahem) "one-liner" per convertirlo nuovamente in half-pages, nell'ordine di pagina corretto di nuovo. Funzionerà per each ALTEZZA e LA LARGHEZZA, nonché per qualsiasi numero di pagine. Nel mio caso avevo un opuscolo di 40 pagine (20 pagine scansionate nel PDF).

 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" 

Devi solo modificare i primi parametri in questo command per specificare l'altezza e la width e ORIG_FILE_PATH. Il resto del command calcola le varie size e chiama gs due volte, quindi pdftk. Sarà anche contare le pagine nella tua scansione e quindi produrre la specifica corretta di sorting (per lo scenario che ho dato).

Essa produce alcuni progressi su ciò che sta facendo, che sarà simile a questo:

 +++ 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 

Poi, per get l'imposizione della pagina necessaria per un opuscolo printingto, puoi semplicemente printingre "ordered.pdf" su una dimensione personalizzata di esattamente la dimensione necessaria (nel mio esempio, 5.5 x 8.5), inviandola a un "booklet making "(nel mio caso, ho usato Creo Booklet per Mac di Christoph Vogelbusch da http://download.cnet.com/Create-Booklet/3000-2088_4-86349.html ).

Il PDF risultante tornerà alla dimensione originale della pagina di 11 x 8,5 con 2 pagine per foglio, ma l'ordine sarà tale da poterlo printingre su due lati e con il taglio a breve termine e voilà! avnetworking una printing che potete fotocopiare e piegare e riposizionare, riproducendo il libretto originale senza disassemblare (o addirittura necessariamente) l'originale.

Spero che questo aiuti qualcuno!

-c

Sulla base della risposta di piptas sopra:

Nelle windows, per la suddivisione di PDF in formato letterale con un'image di copertina singola all'inizio, i seguenti sono stati ottimi per me (nota l'uso di [-612 0] nel secondo passaggio, un valore positivo ha creato delle pagine vuote perché ha spinto il modo sbagliato .)

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

Si noti l'utilizzo di -dFirstPage=2 che istruisce gs per iniziare l'elaborazione a pagina 2.

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

Questo crea right-sections.pdf allo stesso modo. E ora l'image di copertina:

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

Poi, poiché non volevo fondersi con pdftk utilizzando l'inserimento manuale della pagina, ho diviso le sezioni sinistro e destro in PDF separati in una nuova directory.

 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 

Poi unisco i PDF in quella directory, in ordine alfabetico (e fortunatamente ciò significa che sono ordinati nel giusto ordine!) E anche eseguire il risultato tramite ghostscript nuovamente per correggere "Warning: Numero di generazione di 0..65535 range, assumendo 0." errori prodotti da pdftk che ghostscript chiamato "itext-paulo-155 (itextpdf.sf.net-lawagie.com)" – è anche successo per tagliare la dimensione del file a metà nel mio utilizzo. Con un risultato di 4,5 MB, il risultato di pdftk è stato di 6,7 MB e la restituzione di gswin32c ha ridotto a 3,2 MB.

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

E siamo finiti! Sentitevi liberi di eliminare la cartella input_file, cover.pdf, input_temp.pdf, right_sections.pdf e left_sections.pdf. 😉

se hai solo bisogno di pubblicare i pdf pdf di sinistra tutti in un documento e i pdf di destra tutti in un documento, allora il seguente script basato sulla risposta di Kurt Pfeifle farà il trucco (funziona per qualsiasi altezza e width):

 $ 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" 

quindi eseguirlo come così:

 $ ./split.sh thepdftosplit.pdf