Ritagliare un intero PDF con LaTeX

Pubblicato da Nicola Rainiero il 04-07-2012 (aggiornato il 04-05-2015)

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.

  1. 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;
  2. 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;
  3. Si riscrivono opportunamente le misure nel file TEX, l'orientamento della pagina e il numero totale di pagine;
  4. 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.

Come si ricavano le coordinate
Trovo le dimensioni della pagina (595x841 pt)Evidenzio le superfici che mi interessanoNe 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 inputfile prodotto
Esempio visivo del file di input two-side
Esempio visivo del file di output two-side
two_side.pdfda_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.

Come si ricavano le coordinate
Trovo le dimensioni della pagina (841x594 pt)Evidenzio le superfici che mi interessanoNe 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 inputfile prodotto
 Esempio visivo del file di input 4-slideEsempio visivo del file di output 4-slide
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




Potrebbero interessarti anche:

Nicola Rainiero

Ingegnere civile specializzato in geotecnica con l'ambizione di facilitare la propria attività lavorativa usando e creando software libero per un sapere condiviso e collettivo. Mi occupo anche di energie rinnovabili ed in particolare di geotermia a bassa entalpia. Sono da sempre appassionato di web design e modellazione 3D.

Commenti

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

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.