Robitex's Blog

Ideas in the web

Archivi Mensili: agosto 2011

Collage di precisione di PDF


Download the article in the pdf file format

Sommario

Con gli strumenti a disposizione di una distribuzione TeX è possibile ottenere un pdf unendo vari pdf di partenza per di più posizionandoli geometricamente nel modo voluto.
I pacchetti LaTeX utilizzati allo scopo sono il potente PGF, forse il pacchetto dall’implementazione più complessa, e il pacchetto graphicx. Con essi non serve altro che decidere la posizione sul foglio bianco degli singoli oggetti pdf contenuti nei rispettivi file.

Giocando giocando

Un altro esempio di utilizzo di LaTeX come strumento di manipolazione di file PDF è l’opposto dell’idea di estrazione dei contenuti di cui ci siamo occupati nel post precedente: a partire da due o più file PDF se ne vuole fare un collage in un nuovo file PDF.

Come per gli altri collage la cosa si prospetta divertente ma già intravedo dei possibili usi nella pratica professionale. Per il nostro esempio ho dapprima costruito due file pdf contenenti un rettangolo blu ed un rettangolo rosso di date dimensioni, e poi li ho uniti sulla stessa pagina ciascuno in una data posizione.

L’esempio è del tutto generale sia nel numero di pdf da unire sia nel loro contenuto.

Nelle immagini seguenti cliccabili per scaricarne il corrispondente file pdf, vi riporto come appaiono i rettangoli d’esempio e come appare il risultato finale dell’unione secondo posizioni geometriche stabilite.

Blue rectangle, click to download

Blue rectangle, click to download

Red rectancle, click to download

Red rectancle, click to download

Red and blue union, click to download

Red and blue union, click to download

Passiamo la parola quindi al codice, e… buon divertimento!!!

Rettangolo blu

Utilizziamo il potentissimo pacchetto grafico PGF per generare il rettangolo blu, diciamo di 70 x 35 mm con linea a spigoli arrotondati di 5 punti di spessore (in TeX le unità di misura delle lunghezze sono molte e sono tutte interscambiabili):

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz[line width=5pt,color=blue,rounded corners]
  \draw (0,0) rectangle (70mm,35mm);
\end{document}

Ecco fatto (inserite il codice in un file di testo, per esempio con Blocco Note, salvatelo su disco e compilatelo con pdflatex, oppure semplicemente caricate il file nell’editor TeXWorks e premete Control+T), sono in tutto sei righe di codice LaTeX che esprimono in maniera diretta esattamente quello che abbiamo descritto in apertura di paragrafo.

Rettangolo rosso

Per il rettangolo rosso semplicemente cambiamo i parametri di colore e dimensione e ripetiamo la veloce procedura di compilazione per generare il secondo pdf che andremo ad unire in un (primordiale) collage.
Un solo nuovo commento al codice ed è questo: vi segnalo l’uso della classe di documento standalone (ringrazio il Professor Enrico Gregorio per avermi segnalato l’esistenza di questa classe sul forum del GuIT), che genera il file pdf nelle esatte dimensioni di pagina necessarie a contenere gli oggetti che creiamo.

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikz[line width=5pt,color=red,rounded corners]
  \draw (0,0) rectangle (32mm,88mm);
\end{document}

Collage!

Per unire due file pdf l’idea è quella di inserirli in un documento LaTeX attraverso il pacchetto graphicx, come semplici immagini. Tuttavia in questo modo i rettangoli verrebbero inseriti uno sopra l’altro e noi vogliamo qualcosa di più, vogliamo specificarne la posizione geometricamente.
Bene, ricorriamo ancora al pacchetto PGF in combinazione con graphicx, inserendo i file dei rettangoli come fossero il materiale da comporre di un oggetto nodo.
Un nodo PGF può contenere qualsiasi materiale e quindi anche un immagine intera, ed è caratterizzato da un punto di posizionamento (x,y) e da un riferimento di ancoraggio. In questo caso ho scelto l’ancoraggio in basso a sinistra. In altre parole il punto in cui localizziamo il nodo tramite coordinate sul foglio, sarà il punto in cui si troverà la posizione dell’angolo in basso a sinistra dell’immagine (in singolo file pdf).

Ancora, si noti come l’argomento del comando \includegraphics è il nome del file da includere e che questo normalmente va indicato privo di estensione, e che volendo potremo sia ruotare che scalare il pdf da inserire tramite le opzioni angle e scale del comando.
Per quanto riguarda la posizione dei file nell’albero del file system, nell’esempio si è lavorato con i file sorgenti .tex ed il materiale .pdf posizionati tutti nella stessa directory.
Ecco il codice che produrrà il collage di unione rappresentato nell’immagine.
Mi raccomando scaricate i pdf con un click sulle immagini soprastanti per rendervi conto meglio del carattere vettoriale, cioè di massima qualità, dei contenuti grafici.

\documentclass{standalone}
\usepackage{tikz}
\usepackage{graphicx}

\begin{document}
\begin{tikzpicture}[every node/.style={anchor=south west}]
   % disegnamo un circoletto di posizionamento delle coordinate
   % dell'origine del sistema di riferimento
   \draw (0,0) node[circle, draw] {};
   
   \draw (10mm,95mm) node {\includegraphics{blue}}; % insert blue.pdf file
   \draw (0,0) node {\includegraphics{red}};        % insert red.pdf file
\end{tikzpicture}
\end{document}

Per oggi mi fermo qui, alla prossima!

Aprire finestre sul PDF


Sommario

Lavoreremo con i linguaggi Lua e LaTeX per estrarre finestre da un qualsiasi file in formato PDF.
Capita infatti di voler riportare in un nostro documento una tabella, un grafico, un immagine o qualsiasi altro materiale contenuto in un secondo file PDF.
In questo post impareremo ad estrarre rettangoli qualsiasi da una qualsiasi pagina PDF, e l’utilità sta nel fatto che possiamo ottenere le “finestre” nello stesso formato pdf mantenendo la qualità vettoriale dell’originale.

Finestre

Vogliamo ritagliare una finestra rettangolare da un file pdf (che chiameremo originale.pdf). Per esempio, a pagina 21 è riportata una tabella che vogliamo inserire in una presentazione o in un nostro articolo senza perdere in qualità rispetto all’originale.

L’idea per estrarre il contenuto così definito, si basa sulle abilità di manipolazione dei file pdf del sistema TeX che, grazie al pacchetto graphicx, è in grado di ritagliare rispetto alla pagina la finestra voluta.
Dobbiamo quindi avere a disposizione il file pdf contenente quell’unica pagina in cui si trova il materiale da ritagliare e per far questo, ancora una volta ci rivolgeremo ad un pacchetto LaTeX chiamato pdfpages.

L’idea di estrarre la particolare pagina e ritagliarla successivamente, comporta quindi la scrittura e la compilazione di due file sorgenti LaTeX. Ed ecco che entra in scena Lua che ci facilita questo compito.

Estrarre una pagina

Assumendo i dati espressi precedentemente, lo script Lua seguente crea un file .tex opportuno, lo compila con il programma pdflatex e cancella i file temporanei lasciando nella cartella, accanto al file pdf originale (che viene soltanto utilizzato in lettura), il file tmppage21.pdf.
Da notare l’uso del delimitatore di stringa delle doppie parentesi quadre e l’uso della funzione string.format() della libreria standard di Lua, con cui creiamo il sorgente attraverso gli opportuni segnaposto (il numero della pagina ed il nome del file pdf originale).

#!/usr/bin/lua

-- script di estrazione pagina da un file pdf

-- dati
local page = 21
local pdffile = "originale"

-- contenuto del sorgente LaTeX
local extractpage = [[
\documentclass{minimal}
\usepackage{pdfpages}
\begin{document}
\includepdf[pages=%s]{%s}
\end{document}
]]

-- creo il file sorgente tex che estrae
-- la pagina voluta in un secondo file pdf
local pg = tostring(page)
local fn = "tmppage"..pg
local fl = assert(io.open(fn..".tex", "w"))
fl:write(string.format(extractpage, pg, pdffile))
fl:close() 

-- compilazione file tex
os.execute("pdflatex -interaction=nonstopmode "..fn)

-- cancellazione file temporanei
os.remove(fn..".log")
os.remove(fn..".aux")
os.remove(fn..".tex")

Ritagliare una pagina

Ecco il secondo passaggio: ritagliare dalla pagina una finestra pdf. Si può risolvere con un secondo script Lua, simile al precedente, a cui stavolta occorre passare le coordinate x ed y dell’angolo in basso a sinistra e quelle dell’angolo in alto a destra del box (il sistema di riferimento ha l’origine nell’angolo inferiore sinistra del foglio).
Per fare un esempio, immaginiamo di voler estrarre il box della metà superiore di una pagina A4 (210mm x 297mm): le coordinate saranno per il vertice inferiore sinistro ll=(x=0mm, y=148.5mm) e per il vertice in alto a destra ur=(x=210mm, y=297mm).

Questa volta faremo uso della classe standalone, che ha il pregio di produrre una pagina della stessa dimensione del contenuto, e del pacchetto graphicx con cui si inserisce l’immagine che andremo a ritagliare con le coordinate (notate l’opzione viewport):

#!/usr/bin/lua

-- script di ritaglio finestra pdf

-- posizione angoli della finestra
local ll = {x="15mm", y="35mm"} -- ll=lower/left
local ur = {x="195mm", y="72mm"}-- ur=up/right
local page = 21

local ritpage = [[
\documentclass{standalone}
\usepackage{graphicx}
\begin{document}
\includegraphics[viewport=%s %s %s %s]{%s}
\end{document}
]]

-- creo il file sorgente tex di ritaglio
local pg = tostring(page)
local fn = "tmppage"..pg

-- creo il secondo file LaTeX per il ritaglio
local fnrit = "page"..pg..pdffile

local flrit = assert(io.open(fnrit..".tex", "w"))
flrit:write(string.format(ritpage, ll.x, ll.y, ur.x, ur.y, fn))
flrit:close() 

os.execute("pdflatex -interaction=nonstopmode "..fnrit)

-- cancellazione file
os.remove(fn..".pdf")
os.remove(fnrit..".log")
os.remove(fnrit..".aux")
os.remove(fnrit..".tex")

Linguaggio

Fino ad ora la cosa è stata abbastanza rudimentale, almeno come interfaccia utente, infatti i precedenti paragrafi spiegano i concetti ed un implementazione di base, ma siamo in grado di lavorare con un linguaggio più ad alto livello creando una piccola libreria Lua.
Con essa potremo ritagliare oggetti da più file pdf o da più pagine dello stesso documento.
Per il momento tuttavia, lasceremo questa libreria ad un prossimo futuro, cominciando il divertimento dalla costruzione del linguaggio. Non vi rimane che sperimentare questa soluzione e fare le vostre considerazioni.

Note tecniche

Per svolgere le procedure indicate è necessario aver un po’ di dimestichezza con LaTeX (in particolare con i concetti di base dei pacchetti e con il meccanismo di compilazione), ed almeno saper eseguire sul sistema uno script in Lua.
Se siete alle prime armi la prima cosa da fare è installare una distribuzione TeX e leggere una guida di base.
Alla prossima, Ciao.

%d blogger hanno fatto clic su Mi Piace per questo: