GNU/Linux >> Linux Esercitazione >  >> Linux

Taglia le pagine di un PDF in più pagine

Puoi risolverlo con l'aiuto di Ghostscript. pdftk da solo non può farlo (per quanto ne so). Ti darò i passaggi della riga di comando per farlo manualmente. Sarà facile scrivere questa procedura come procedura, anche con parametri diversi per dimensioni e numeri di pagina. Ma hai detto che puoi farlo da solo;-)

Come risolvere questo problema con l'aiuto di Ghostscript...

...e per il gusto di farlo, di recente non l'ho fatto con un file di input con pagine "double-up", ma uno con "treble-up". Puoi leggere la risposta per questo caso qui .

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

Vuoi creare 1 PDF con 4 pagine, ognuna delle quali ha le dimensioni di 421 pt x 595 pt.

Primo passo

Per prima cosa estraiamo 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?

Innanzitutto, sappi che in PDF 1 pollice ==72 punti . Poi il resto è:

  • -o ...............: File di output dei nomi. Usa implicitamente anche -dBATCH -dNOPAUSE -dSAFER .
  • -sDEVICE=pdfwrite : vogliamo PDF come formato di output.
  • -g................: imposta la dimensione del supporto di output in pixel. La risoluzione predefinita di pdfwrite è 720 dpi. Quindi moltiplica per 10 per ottenere una corrispondenza per PageOffset.
  • -c "..............: chiede a Ghostscript di elaborare il frammento di codice PostScript dato appena prima del file di input principale (che deve seguire con -f ).
  • <</PageOffset ....: imposta lo spostamento dell'immagine della pagina sul supporto. (Naturalmente, per le pagine a sinistra lo spostamento di [0 0] non ha alcun effetto reale.)
  • -f ...............: elaborare questo file di input.

Quale risultato ha ottenuto l'ultimo comando?

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 passaggio

Successivamente, le sezioni giuste:

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

Nota l'offset negativo poiché stiamo spostando la pagina a sinistra mantenendo ferma l'area di visualizzazione.

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 passaggio

Ora combiniamo le pagine in un unico file. Potremmo farlo anche con ghostscript, ma useremo pdftk invece, 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, dimensioni 421x595 pt.

Risultato:

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

C'è uno strumento pdfposter che può essere utilizzato per creare PDF con più pagine per una pagina di input (affiancando o tagliando le pagine). È simile allo strumento poster , che fa lo stesso per i file PostScript.


Quindi, dopo molte altre ricerche (sembra che "PDF cut pages" sia una ricerca di gran lunga migliore), ho trovato un piccolo script chiamato unpnup che usa poster , conversione PDF/PS e pdftk per fare esattamente ciò di cui ho bisogno. È un po' lungo, ma è di gran lunga superiore agli altri metodi che ho trovato (come l'utilizzo di imagemagick) perché non rasterizza le pagine prima di espellerle.

Nel caso in cui mobileread vada via per qualche motivo, il nucleo dello script (concesso in licenza sotto 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

Linux
  1. Come dividere l'archivio "tar" di grandi dimensioni in più file di determinate dimensioni

  2. Come dividere un singolo file in più file in base alle righe

  3. Comando per comprimere più directory in singoli file zip?

  4. Come unire più connessioni Internet in una?

  5. Come dividere un file di testo in più file *.txt?

Come unire più righe in una in un file in Linux

Come unire più file PDF in un unico PDF in Linux

Come unire/unire più file audio in uno in Linux

Come unire più pagine PDF in una singola pagina

Come faccio a stampare una pagina grande su più pagine più piccole?

Combina più comandi unix in un unico output