Nottolino
11 Oct 2021

Trattamento delle fotocopie

Ieri mi sono trovato a rimettere in ordine alcune scansioni da un libro.

Mi sono ritrovato una scansione a colori delle due pagine affiancate di un libro per singolo foglio, con un ampio margine laterale, in un gruppo di file PDF denominati da 1.pdf a 4.pdf.

L'obiettivo principare era quello di arrivare ad un nuovo file PDF in cui fosse presente una singola pagina per foglio, riducendo il margine bianco. Va notato che per come è fatta la scansione la gran parte del margine bianco è sulla sinistra e in alto della pagina.

Il lavoro da fare era quindi il seguente:

  1. riunire tutti i file in un unico file chiamato L.pdf
  2. spezzare il foglio in due (uso mutool)
  3. dividere le pagine pari da quelle dispari (estraggo le pagine con pdfseparate e le ricompongo con con pdfunite)
  4. ritaglio (crop) separatamente i file delle pagine pari e quelle dispari in modo da ottenere una pagina visivamente simile.
  5. ricompongo i due file con le pagine pari e dispari in un unico PDF finale definitivo.

Riunire vari PDF in un unico file PDF

mutool ci permette di fare questa operazione in modo molto semplice.

mutool merge 1.pdf 2.pdf 3.pdf 4.pdf -o A.pdf

adesso il file A.pdf contiene l'intera scansione. L'opzione merge di mutool permetterebbe anche di selezionare quale pagine di quale file riportare all'interno del PDF di output semplicemente scrivendo dietro il file PDF di input il numero della pagina da estrarre secondo la sintassi:

mutool merge
usage: mutool merge [-o output.pdf] [-O options] input.pdf [pages] [input2.pdf] [pages2] ...
        -o -    name of PDF file to create
        -O -    comma separated list of output options
        input.pdf       name of input file from which to copy pages
        pages   comma separated list of page numbers and ranges
20211011A-F1.png
Figure 1: Una dei fogli del PDF scansionato in originale. Su foglio sono presenti le due pagine del libro da separare e trattare

Dividere i fogli

Questa operazione è semplice e diretta, basta ancora usare mutool e l'opzione poster. L'opzione poster, come dice il nome, servirebbe piuttosto a spezzare una foglio in un certo numero di parti per poi poter ricostruire una stampa molto ampia, un poster appunto, con quella pagina; noi la useremo piuttosto per spezzare in due in verticale tutte la pagine di un PDF.

mutool poster -y 2 A.pdf B.pdf

L'opzione -y 2 indica, come richiesto, la divisione del foglio in due secondo la direttrice verticale.

20211011A-F2.png
Figure 2: Adesso le due pagine sono state separate in due fogli differenti nel file PDF. Qui il problema è che i margini sono spropositati e andrebbero rifilati un po'. Questa è una pagina pari, i margini da rifilare sono a sinistra e sopra.
20211011A-F3.png
Figure 3: Questa è una pagina dispari, i margini da rifilare sono a destra e sopra.

Dividere in pari e dispari

Come si può vedere dal file PDF prodotto i margini bianchi per le pagine pari e dispari sono differenti, per fare un lavoro più preciso è necessario separare il file B.pdf in due: B-pari.pdf contenente le pagine pari e B-dispari.pdf contenente le pagine dispari.

Lo si fa in due passi:

  1. Si esportano tutte le pagine singole del PDF (con pdfseparate)
  2. Le si ricompongono con pdfunite

Separazione delle singole pagine di un pdf

Anche questa operazione è semplice usando pdfseparate:

pdfseparate B.pdf pag-%d.pdf

Dopo l'esecuzione di questo comando vi troverete nella directory un lungo elenco di file denominati pag-1.pdf, pag-2.pdf e così via. Ogni file contiene una singola pagina.

L'espressione che identifica il file di output pag-%d.pdf include una stringa di formato (%d) che è classica nella programmazione In questo caso indica che si sostituirà quel segnaposto con il valore del numero della pagina.

Ricomposizione di un file PDF dalle pagine componenti

A questo punto dobbiamo solo ricomporre il file usando pdfunite selezionando solo le pagine dispari o pari, in questo modo:

pdfunite pag-1.pdf pag-3.pdf pag-5.pdf ... B-dispari.pdf
pdfunite pag-2.pdf pag-4.pdf pag-6.pdf ... B-pari.pdf

ovviamente scrivere questi comandi è un po' noioso perché bisogna elencare tutti i file delle pagine, ma è possibile una semplificazione usando la Korn Shell e le sequenze numeriche della shell in questo modo.

ksh
pdfunite pag-{1..<n>..2}.pdf B-dispari.pdf
pdfunite pag-{2..<n>..2}.pdf B-pari.pdf

dove <n> è l'ultimo numero di pagina disponibile.

A questo punto hai a disposizione i due file contenti le pagine pari e dispari.

Ritaglio

Per ritagliare (crop) le pagine puoi usare il comando pdfjam in questo modo:

pdfjam --keepinfo --trim "30mm 10mm 10mm 25mm" --clip true --suffix "ritagliato" B-pari.pdf
pdfjam --keepinfo --trim "10mm 10mm 40mm 25mm" --clip true --suffix "ritagliato" B-dispari.pdf

Le dimensioni presenti nell'opzione -trim sono nella sequenza: sinistra sotto destra sopra e vanno trovate facendo un po' di prove. Alla fine verrà fuori un file denominato con il suffisso indicato (nel nostro caso i file saranno B-pari-ritagliato.pdf e B-dispari-ritagliato.pdf).

20211011A-F4.png
Figure 4: Ora le pagine pari sono state rifilate levando 3cm a sinistra e 2.5cm sopra e 1cm sugli altri bordi.
20211011A-F5.png
Figure 5: Le pagine dispari sono state rifilate levando addirittura 4cm a destra e sempre 2.5cm sopra e 1cm altrove. Va notata una cosa, rifilando il bordo di destra sono state tagliate anche le scritte a penna blu e rossa. Nel mio caso questo non è un fastidio (anzi io vorrei levare tutto quello che è stato scritto a penna o evidenziato dalle pagine). Altrimenti si dovrebbe rifilare un po' meno.

Ricomposizione

Ora non resta che ricomporre il file PDF definitivo e si può usare pdftk così:

pdftk A=B-dispari-ritagliato.pdf B=B-pari-ritagliato.pdf shuffle A B output risultato.pdf

Il file finale si chiama ora risultato.pdf.

Uno script

Per non dimenticare i passaggi io di solito mi costruisco sempre brevi script shell. Questo è quello per il compito in esame:

#! /bin/bash
# epdf_split-n-crop input.pdf "even-page-trim-dimensions" "odd-pages-trim-dimensions"  output.pdf
INPUT=$1
OUTPUT=$4
EVENP_TD=$2
ODDP_TD=$3
mutool poster -y 2 $1 B-$1.pdf
pdfseparate B-$1.pdf pag-%d.pdf
ULTIMA_PAG=$(ls -1 pag-*.pdf|cut -c 5-|cut -d. -f 1|sort -n|tail -1)
echo "pdfunite pag-{1..$ULTIMA_PAG..2}.pdf B-dispari.pdf "|ksh
echo "pdfunite pag-{2..$ULTIMA_PAG..2}.pdf B-pari.pdf "|ksh
pdfjam --keepinfo --trim "$EVENP_TD" --clip true --suffix "ritagliato" B-pari.pdf
pdfjam --keepinfo --trim "$ODDP_TD" --clip true --suffix "ritagliato" B-dispari.pdf
pdftk A=B-dispari-ritagliato.pdf B=B-pari-ritagliato.pdf shuffle A B output $OUTPUT
rm pag-*.pdf B-dispari*.pdf B-pari*.pdf

In questo script ci sono solo due piccole magie. La riga

ULTIMA_PAG=$(ls -1 pag-*.pdf|cut -c 5-|cut -d. -f 1|sort -n|tail -1)

calcola da sola il numero dell'ultima pagina disponibile. Le due righe seguenti mandano il comando ad una Korn Shell sottostante perché la Bash shell (che si usa di solito) non ha quel tipo di sequenze con l'indicazione del passo.

Conclusioni e miglioramenti

L'obiettivo era rimettere a posto un PDF scansionato in modo da ottenere un file più facile da studiare, ad esempio su un tablet.

Alcuni miglioramenti potrebbero essere fatti:

  1. Forse il miglioramento più importante sarebbe quello di far diventare il file PDF finale ricercabile, ovvero far passare un OCR sul prodotto finale. Non me la cavo troppo bene con questo e l'unica idea che mi verrebbe ora come ora è usare il programma dello scanner (purtroppo non open-source). Per farlo dovrei di nuovo spaginare il file e trasformarlo in immagini JPG contenenti una singola pagina, poi darlo in pasto al programma dello scanner che potrebbe a quel punto salvarlo in PDF/A ricercabile, facendo quindi passare il suo OCR sopra. Qualcuno ha una migliore idea?
  2. Potrebbero essere scoperti automaticamente i margini del ritaglio (cosa non necessariamente facile da fare). Non saprei come fare.
  3. Questo mi viene in mente guardando la scansione che ho a disposizione che è evidenziata e sottolineata (fortunatamente scansionata a colori). Sarebbe possibile eliminare dalle pagine tutto quello che non è di colore nero? (questo potrebbe tornare utile).

Potete come sempre scrivermi per le vostre soluzioni (che pubblicherò qui)

Tags: workflow pdf scansioni
Other posts
Creative Commons License
exedre.org by Emmanuele Somma is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.