Ritagliare un intero PDF con LaTeX
Spesso e volentieri si vorrebbero poter leggere comodamente a video, su carta o su lettore eBook tutti quei PDF che sono in doppia facciata o sono presentazioni contenenti 2 o 4 slide per pagina, senza dover zoomare o spostarsi da una parte all'altra. Dopo diverse ricerche infruttuose ho trovato un'ottima soluzione: LaTeX. Mostrerò con 2 esempi come procedere e ritagliare in automatico due diverse tipologie di PDF con le quali spesso ho a che fare.
Parlando di LaTeX molte volte ad amici o colleghi, provoco in loro sorrisi maliziosi o commenti pruriginosi, ma voglio placare sul nascere i vostri bollenti spiriti: si pronuncia /ˈlatek/ in italiano ed è un potente linguaggio di markup usato per la preparazione di testi e basato sul programma di composizione tipografica TEX come riportato su Wikipedia. Per chi volesse approfondirne la conoscenza consiglio questa ottima guida introduttiva: L'arte di scrivere con LaTeX di Lorenzo Pantieri e Tommaso Gordini.
Dopo questa doverosa introduzione, ho trovato in internet per pura casualità la soluzione a tutti i miei problemi: il file two2one.tex di J.S.Milne, rintracciabile a questo indirizzo. All'inizio ho fatto più di qualche tentativo per ottenere risultati accettabili, perché sbagliavo a prendere le misure e a volte i ritagli non rispettano più le proporzioni classiche dell'A4 così nel file di output ricomparivano nuovi bordi. Anche per questa scocciatura ho trovato soluzione leggendo questo articolo: LaTeX - how do I force PDF page height/width?.
Requisiti
LaTeX con i pacchetti: geometry per definire la nuova dimensione della pagina, pdfpages per includere pagine PDF nei documenti e ifthen per poter inserire comandi condizionali. Oppure si può utilizzare WriteLatex senza installare alcunché.
Procedura tipo in 4 passaggi
Prima di passare ai due esempi chiarificatori spiegherò quali sono i passaggi da compiere.
- Si devono conoscere:
- le dimensioni esatte in point (pt) del PDF (larghezza x altezza), l'orientamento del foglio (portrait=verticale, landscape=orizzontale) e il numero di pagine da ritagliare;
- Le 2 coordinate misurate sempre in point: x0,y0 in basso a sinistra (approssimate per difetto) e x1,y1 in alto a destra (approssimate per eccesso) che definiscono tutte le parti da ritagliare per ogni pagina;
- Si devono poi omogeneizzare i ritagli in modo da avere pagine finali della stessa dimensione, ovvero si sottraggono le coordinate trovate (x1-x0=largezza, y1-y0=altezza) per ognuno e si userà quella più grande per definire la nuova dimensione del PDF;
- Si riscrivono opportunamente le misure nel file TEX, l'orientamento della pagina e il numero totale di pagine;
- si compila il tutto con pdflatex.
Esempio 1: documento in doppia facciata
Classico PDF ottimizzato per la stampa che dispone di due differenti margini in funzione della pagina sinistra e destra.
Trovo le dimensioni della pagina (595x841 pt) | Evidenzio le superfici che mi interessano | Ne ricavo le singole coordinate (x,y) |
Con i dati trovati scrivo il seguente file in LaTeX (da_two_side.tex):
%%Original version by J.S.Milne 25.09.05 (two2one.tex - http://www.jmilne.org/math/Books/scan.html) %%Updated by Nicola Rainiero (http://rainnic.altervista.org/it/tag/latex) %%Correct this file for the number of pages in your document %%Correct this file for the size of your document in postscript points %%To do this, you need to find the size of your input document in points (Inkscape, Gimp or PDF Reader) %%Run pdflatex on this file: pdflatex "name of this file" % letterpaper, landscape or portrait \documentclass[portrait]{minimal} %%force the final dimension of PDF, put the maximum difference among the coordinates of the cropped areas %%(x direction: width, y direction: height) \usepackage[paperwidth=383pt,paperheight=696pt]{geometry} \usepackage{pdfpages} \usepackage{ifthen} \newcounter{pg} %counter of pages \begin{document} \setcounter{pg}{1} %fix the first page %% my pdf file has 10 pages %% my pdf file has size 595 x 841 points (width X height) \whiledo{\value{pg}<10}{% default pages + 1, pages +0 if there are two increments of pg %%x0,y0 at the bottom left -- x1,y1 at the top right of the selection \includepdf[pages=\thepg,viewport=80 87 463 783]{two_side.pdf} %pages on the right side, (odd pages) \addtocounter{pg}{1} %page increment \includepdf[pages=\thepg,viewport=128 87 511 783]{two_side.pdf} %pages on the left side, (even pages) \addtocounter{pg}{1} %page increment }% \end{document}
Risultato finale
file di input | file prodotto |
two_side.pdf | da_two_side.pdf |
Esempio 2: presentazione orizzontale costituita da 4 slide per facciata
Ho scelto questa tipologia, per evidenziare la versatilità e la semplicità del ritaglio con questo metodo.
Trovo le dimensioni della pagina (841x594 pt) | Evidenzio le superfici che mi interessano | Ne ricavo le singole coordinate (x,y) |
Con i dati trovati scrivo il seguente file in LaTeX (da_4_slide_orizzontali.tex):
%%Original version by J.S.Milne 25.09.05 (two2one.tex - http://www.jmilne.org/math/Books/scan.html) %%Updated by Nicola Rainiero (http://rainnic.altervista.org/it/tag/latex) %%Correct this file for the number of pages in your document %%Correct this file for the size of your document in postscript points %%To do this, you need to find the size of your input document in points (Inkscape, Gimp or PDF Reader) %%Run pdflatex on this file: pdflatex "name of this file" %%letterpaper, landscape or portrait \documentclass[landscape]{minimal} %%force the final dimension of PDF, put the maximum difference among the coordinates of the cropped areas %%(x direction: width, y direction: height) \usepackage[paperwidth=285pt,paperheight=199pt]{geometry} \usepackage{pdfpages} \usepackage{ifthen} \newcounter{pg} %counter of pages \begin{document} \setcounter{pg}{1} %fix the first page %% my pdf file has 1 page %% my pdf file has size 841 x 594 points \whiledo{\value{pg}<2}{% default pages + 1, pages +0 if there are two increments of pg %%x0,y0 at the bottom left -- x1,y1 at the top right of the selection \includepdf[pages=\thepg,viewport=68 347 353 546]{4_slide_orizzontali.pdf} %first slide \includepdf[pages=\thepg,viewport=488 347 773 546]{4_slide_orizzontali.pdf} %second slide \includepdf[pages=\thepg,viewport=68 49 353 248]{4_slide_orizzontali.pdf} %third slide \includepdf[pages=\thepg,viewport=488 49 773 248]{4_slide_orizzontali.pdf} %fourth slide \addtocounter{pg}{1} %page increment } \end{document}
Risultato finale
file di input | file prodotto |
4_slide_orizzontali.pdf | da_4_slide_orizzontali.pdf |
Tutti i PDF di questa guida e i corrispettivi file TEX sono stati compressi qui: Esempi_su_come_ritagliare_un_PDF.zip
Commenti
In effetti sto ancora
In effetti sto ancora cercando il giusto compromesso per i CAPTCHA! E nonostante questa configurazione (ne avevo provate ancora di più difficili, ma erano impossibili da leggere!) riesce lo stesso a passare 1 messaggio di spam al giorno... Mi sa che è una battaglia persa!
Aggiungi un commento