Robitex's Blog

Ideas in the web

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.

Una risposta a “Aprire finestre sul PDF

  1. Pingback:Collage di precisione di PDF « Robitex's Blog

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: