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:
- riunire tutti i file in un unico file chiamato
L.pdf - spezzare il foglio in due (uso
mutool) - dividere le pagine pari da quelle dispari (estraggo le pagine con
pdfseparatee le ricompongo con conpdfunite) - ritaglio (crop) separatamente i file delle pagine pari e quelle dispari in modo da ottenere una pagina visivamente simile.
- 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
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.
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:
- Si esportano tutte le pagine singole del PDF (con
pdfseparate) - 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).
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:
- 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?
- Potrebbero essere scoperti automaticamente i margini del ritaglio (cosa non necessariamente facile da fare). Non saprei come fare.
- 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)
