Robitex's Blog

Ideas in the web

Archivi Categorie: PDF

Opuscoli e booklet


Sommario

Utilizzeremo il sistema TeX per comporre documenti in formato A4 su libretti in formato A3.

Capita…

Capita di dover stampare fronte retro dei documenti ripiegando i fogli in un libretto. Chiameremo questa modalità booklet oppure opuscolo.
L’esempio è il seguente: abbiamo a disposizione un documento di quattro pagine nel formato A4 e vorremo comporlo nel formato A3 fronte retro in modo che il foglio A3 ripiegato formi l’opuscolo, come in questa raprresentazione:

Fronte:
+-----++-----+
|  4  ||  1  |
|     ||     |
+-----++-----+

retro:
+-----++-----+
|  2  ||  3  |
|     ||     |
+-----++-----+

La soluzione con LaTeX

Quella che vi propongo è una soluzione che ha il pregio di rappresentare un esempio che può essere applicato a casi anche molto più complicati di quello in esame, e consiste nel salvare un file di testo puro nella stessa cartella contenente il file che chiameremo docA4.pdf con le quattro pagine, con il seguente contenuto:

\documentclass{minimal}
\usepackage[a3paper,landscape]{geometry}
\usepackage{pdfpages}

\begin{document}
\includepdf[pages={4,1,2,3},nup=2x1]{docA4}
\end{document}

Compilando questo file (dategli l’estensione .tex) quello che succede è questo:

  1. viene impostato il formato di pagina A3 orizzontale;
  2. viene caricato il pacchetto pdfpages che definisce il comando \includepdf;
  3. e poi si inseriscono nel documento una alla volta e nella sequenza corretta, le pagine del documento in A4.

Il comando \includepdf offre molte altre opzioni: consultate la documentazione del pacchetto per scoprirle.

Un documento di esempio

Volendo, possiamo produrre sempre con LaTeX un documento da utilizzare per verificare che il codice precedente funziona. Basta compilare questo codice più complicato del precedente perché fa uso di un po’ di programmazione della nuova libreria LaTeX3, in modo da poter generare documenti demo di qualsiasi lunghezza (basta cambiare l’argomento del comando \demodoc):

\documentclass{minimal}
\usepackage[a4paper]{geometry}
\usepackage{graphicx}
\usepackage{xparse}

%%% codice LaTeX3
\ExplSyntaxOn
\NewDocumentCommand{ \demodoc }{ m }
   {
   \demodoc_repeat:n { #1 }
   }

\cs_new_protected:Nn \demodoc_repeat:n
   {
   \int_step_inline:nnnn { 1 }{ 1 }{ #1 }
      { \centering
        \scalebox{12}{##1}
        \newpage
      }
   }
\ExplSyntaxOff

\begin{document}
\demodoc{4}
\end{document}

Ecco pronto da scaricare il file risultato docA4.pdf.

Note tecniche

Per avvalersi delle magie compositive di pdfpages per la costruzione di opuscoli, occorre installare sul vostro computer una distribuzione TeX – che fa sempre comodo e non costa nulla – ed io vi consiglio spassionatamente TeX Live disponibile per praticamente tutti i sistemi operativi.

Ciao a tutti!

Annunci

LuaTeX and METAPOST


La libreria MPlib in LuaTeX

METAPOST, il noto linguaggio di disegno vettoriale, è stato incluso in LuaTeX sotto forma della libreria MPlib. Possiamo quindi inserire codice METAPOST direttamente in un sorgente LuaTeX.

Questa modalità, non richiede conversioni del formato d’uscita di METAPOST (.mps) ne la necessità di particolari opzioni di compilazione, mentre per procedere ancora più velocemente con l’unico passo di compilazione, basta utilizzare un editor come TeXWorks, in cui LuaTeX si avvia con un semplice click.
Da riga di comando darete invece la classica istruzione:

... alla riga di comando
... (occorre una installazione di
... TeX Live abbastanza recente)

$ luatex nomefile

Sorgente modello

In concreto, trovate di seguito il template del codice in linguaggio TeX dove si dovrà inserire il codice METAPOST tra le macro \mplibcode e \endmplibcode, con le uniche attenzioni di non lasciare in esso, ne righe vuote ne commenti con il carattere percentuale:

% source template
% LuaTeX with Metapost

\input luamplib.sty
\nopagenumbers

\mplibcode
   <codice METAPOST>
\endmplibcode
\bye

Il codice fornirà il pdf della figura che scontorneremo poi con l’utility pdfcrop (ecco perché si sopprime la numerazione di pagina), per inserire il risultato in altri documenti. Naturalmente, mutatis mutandis, potremo lavorare allo stesso modo ma con LuaLaTeX per avere a disposizione la potenza espressiva di LaTeX.

Un esempio è riportato nel seguente codice, che produce la figura successiva scaricabile come pdf.

% a drawing example

\input luamplib.sty
\nopagenumbers

\mplibcode
beginfig(1);
u := 100mm;
for a = 0 step 15 until 90:
draw origin -- u*dir(a)
  withpen pencircle scaled 2pt
  withcolor red;
endfor;
endfig;
\endmplibcode
\bye

An example of a METAPOST figure building directly in LuaTeX engine.


Non male!
Un saluto.
R.

Click and script


Scarica l’articolo nel formato PDF

Sommario

In questo post impareremo come personalizzare il menù contestuale in Nautilus, il gestore di file incorporato in Gnome, fino a compilare al volo sorgenti LaTeX e compiere moltissime altre operazioni che possono essere ripetitive.

Il menù contestuale

Nelle moderne interfacce grafiche il menù contestuale è un efficace idea che presenta all’utente le operazioni effettuabili su uno specifico oggetto. Se per esempio si tratta di un file compresso il click destro sull’icona che lo simboleggia, attiverà un menù contestuale che presenta le apposite voci per l’estrazione del contenuto.

In Linux, nel Desktop Environment Gnome è possibile associare a questi menù piccoli programmi per lanciarli comodamente dopo aver selezionato i file d’interesse.

Nautilus-scripts

Nautilus è il file manager di Gnome. Grazie al supporto per lo scripting, le operazioni per creare una nuova voce di menù contestuale sono davvero semplici, allo stesso modo di quelle da svolgere per creare un nuovo modello di documento come già illustrato in questo post. Basta creare il file con il codice, assegnargli i permessi di esecuzione e spostarlo nella directory nascosta $HOME/.gnome2/nautilus-scripts.

Menù contestuale su un file compresso in Gnome

Menù contestuale su un file compresso in Gnome

Come è naturale sui sistemi Linux, possiamo scrivere script in molti linguaggi, da Bash a Python. Noi utilizzeremo anche Lua pertanto dovrete assicurarvi che sia installato sul vostro sistema.

I nostri comandi personalizzati

Ecco in concreto, alcune idee di personalizzazione del menù. Ciascun nuovo comando contestuale deriva da esigenze della pratica quotidiana.
Molte altre idee possono essere realizzate per rendere più semplice l’utilizzo del pc, per esempio unire più file di testo o spedire documenti ad un indirizzo di posta elettronica…

Mandare in stampa un documento

Se desidero lanciare la stampa di un file PDF lo apro con un visualizzatore ed eseguo il comando di stampa. Se i PDF da stampare sono molti invece, apro il terminale, posiziono la working directory e lancio la stampa di tutti i PDF presenti con il comando:

$ lpr *.pdf

Con qualche conoscenza in più di Bash (il linguaggio standard per l’amministrazione dei sistemi Linux ma anche di quelli Mac OS X ormai), si costruisce un piccolo e semplicissimo script:

#!/bin/bash

for arg do
    lpr "$arg"
done

Salviamone il contenuto in un file di testo chiamato per esempio goToPrinter, assegniamogli i permessi di esecuzione (anche dal menù Proprietà) e spostiamolo nella directory nascosta $HOME/.gnome2/nautilus-scripts. Di seguito la sequenza dei comandi e l’immagine della sessione corrispondente al terminale:

$ chmod +x goToPrinter
$ mv goToPrinter ~/.gnome2/nautilus-scripts
Sessione al terminale per la creazione del Nautilus script

Sessione al terminale per la creazione del Nautilus script

Elencare file

Modificando un poco lo script precedente possiamo ottenere facilmente un file di testo contenente la lista dei file selezionati sostituendo ad lpr il comando echo e reindirizzandone l’output verso un file. Utilizzeremo poi la libreria zenity per mostrare un dialogo che mostri all’utente il numero dei file conteggiati.

#!/bin/bash

for arg do
    echo "$arg"
done >> listoffiles.txt

zenity --info --width=200 --height=100 \
       --title="Conteggio file elencati" \
       --text="Numero di file elencati: $# "

Compilare un sorgente LaTeX

Compilare un sorgente LaTeX non è un problema se ci si avvale di un editor come TeX Works, oppure direttamente del terminale, ma se lo possiamo fare con un semplice click destro sulla selezione di file è davvero elegante.
Il codice in Lua provvede a filtrare i file selezionati al momento dell’apertura del menù contestuale in base all’estensione solitamente assegnata ai sorgenti LaTeX.

#!/usr/bin/lua

-- ottengo la lista dei file selezionati
-- dalla variabile d'ambiente opportuna
--
local s = os.getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS")

-- per ogni file con estensione .tex
-- procedo alla compilazione
--
for path in string.gmatch(s,"(.-)\n") do
   -- estrazione estensione
   local ext = string.match(path,"%.(.-)$")
   
   -- se l'estensione esiste allora compilo
   -- se è un sorgente .tex
   if ext then
   if string.lower(ext) == "tex" then
      local ps = "(.-)%." .. ext .. "$"
      local name = string.match(path,ps)
      
      os.execute('pdflatex -interaction=nonstopmode "'..name..'"')
      os.remove(name..".log")
      os.remove(name..".aux")
   end
   end
end

-- end of Lua script

Ottenere il pdf di file di testo

Con poche modifiche possiamo adattare il codice precedente per ottenere uno script che converte i file di testo in formato PDF utilizzando LaTeX:

#!/usr/bin/lua

local docsource = [[
\documentclass[a4paper]{article}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}

\usepackage[margin=20mm]{geometry}

\usepackage{inconsolata}

\begin{document}
\ttfamily
%s
\end{document}
]]

-- ottengo la lista dei file
local s = os.getenv("NAUTILUS_SCRIPT_SELECTED_FILE_PATHS")

for path in string.gmatch(s,"(.-)\n") do
   -- estrazione estensione
   local ext = string.match(path,"%.(.-)$")
   
   -- se l'estensione esiste allora creo il pdf con LaTeX
   if ext then
   if string.lower(ext) == "txt" then
      local ps = "(.-)%." .. ext .. "$"
      local filename = string.match(path,ps)
      
      -- lettura del file
      local textfile = io.open(path,"r")
      local content = string.gsub(textfile:read("*all"),"\n","\n\n")
      local sourcetexfile = string.format(docsource,content)
      textfile:close()
      
      -- creazione sorgente
      local sf = io.open(filename..".tex","w")
      sf:write(sourcetexfile)
      sf:close()
      
      os.execute("pdflatex -interaction=nonstopmode "..filename)
      os.remove(filename..".log")
      os.remove(filename..".aux")
      os.remove(filename..".tex")
   end
   end
end

-- end of Lua script

Conclusioni

Il menù contestuale è davvero comodo. In Linux possiamo utilizzare diversi linguaggi di scripting per creare nuove voci di comandi con cui semplificare il lavoro quotidiano analizzando attentamente le nostre necessità.
Un saluto.

Note tecniche

Sul sistema devono essere installati e correttamente configurati i pacchetti e gli eseguibili di un sistema TeX ed un interprete Lua.
Gli esempi potrebbero richiedere leggere modifiche per distribuzioni Linux diverse da Ubuntu 10.04.

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.

Inviare pdf in modo sicuro


Attenzione: la procedura di messa in sicurezza di un pdf utilizzando la cifratura interna sembra essere non molto sicura.
Provvederò quindi ad aggiornare il post. Grazie.

Scarica l’articolo nel formato pdf per la stampa

Il problema

Con la diffusione di internet lo scambio di documenti avviene sempre più spesso tramite il servizio base della posta elettronica. Tuttavia i messaggi e-mail non sono sicuri ed i documenti che un tempo venivano consegnati o ritirati a mano con la sicurezza della fisicità, oggi possono essere letti da terzi con la violazione dei messaggi digitali che transitano su connessioni internet non protette.

Pensiamo al caso di una piccola azienda od un artigiano che ogni mese riceve nel formato PDF i moduli di pagamento F24 od i cedolini delle buste paga dei propri dipendenti dall’ufficio del commercialista.

Quasi sicuramente il testo del messaggio e-mail conterrà la classica dicitura sulla protezione dei dati personali secondo la legge sulla privacy, ma i documenti PDF allegati saranno invariabilmente in chiaro!!!

Cosa possiamo fare? Tornare a visitare i vari uffici per raccogliere di persona i documenti cartacei? Saremo costretti a prendere l’auto impiegando tempo ed inquinando ulteriormente l’ambiente urbano, anche se ne gioverebbero i rapporti interpersonali (il computer ci fa vivere in un mondo cerebrale…).

Una soluzione

La soluzione più robusta è quella di blindare il messaggio di posta elettronica garantendo non solo l’integrità dell’e-mail ma anche la sicurezza sull’identità del mittente. Ci si può rivolgere per esempio a software come GNUPG che fa esattamente quello che serve e di cui potete trovare una splendida guida in italiano di Mario Pascucci sempre valida e completa sia per Windows che per Linux.

Per usare GNUPG è necessario creare una coppia di chiavi, quella pubblica e quella privata, creare una password phrase per la sicurezza locale del sistema, utilizzare il sistema di server per l’upload della chiave pubblica, ed accertarsi fisicamente che la chiave pubblica del proprio corrispondente appartenga effettivamente a lui. Da quel momento sarà possibile crittografare i messaggi e pure firmarli digitalmente.

Tuttavia questo sistema mi sembra un po’ troppo. Direi quindi di sacrificare un po’ di sicurezza ma di acquistare semplicità concettuale rinunciando alla certezza del mittente del messaggio.

Una soluzione più comoda

Assumendo di voler trasmettere solo file PDF, li blinderemo con l’utility libera pdftk. Ecco quel che dovremo fare: preparare i due PC di mittente e destinatario e costruire una password robusta nota solo ad entrambi e cifrare/decifrare i documenti.

Se solo al mittente ed al destinatario è nota la password e se il destinatario riesce a decifrare correttamente il file pdf contenuto nel messaggio, allora possiamo ragionevolmente supporre che solamente i due soggetti hanno avuto accesso al messaggio (e quindi la comunicazione è sicura), e che il nostro mittente sia effettivamente colui che ha spedito il messaggio.
Diversamente vorrà dire che la password sarà stata violata in qualche modo. Dunque è essenziale che la password sia robusta e nota solo agli interessati, altrimenti tutta la procedura verrà inficiata.

Preparare il PC

Per preparare il PC basta installare pdftk. Assumendo che il sistema sia un pc Ubuntu è sufficiente digitare il comando:

sudo apt-get install pdftk

Anche per gli utenti Windows l’installazione è semplice: è sufficiente seguire la procedura descritta alla pagina ufficiale del pacchetto (si tratta di scaricare un file e scompattarlo in una cartella opportuna).

Scambiarsi la password

Una volta costruita una password robusta, per esempio ‘g456Wsa+dh’, annotatela su un foglio e recatevi di persona dal vostro corrispondente. Questo passaggio è essenziale perché come già detto, dalla sicurezza di questa password dipenderà la sicurezza di tutti i vostri documenti contenuti nei messaggi e-mail.
Se il corrispondente è geograficamente lontano potreste ricorrere al telefono od alla posta, con le modalità fantasiose che si possono inventare divertendosi (per esempio una specie di caccia al tesoro in cui la password viene suddivisa in due o tre tronconi e trasmessa con mezzi fisici diversi assieme alle istruzioni di montaggio, ma solo se il corrispondente mostra spirito goliardico).

Procedura operativa: cifratura

Sia mydoc.pdf il file pdf da trasmettere allora per cifrarlo a 128 bit aprite il Terminale (o la finestra di console di Windows) e digitate il comando:

pdftk mydoc.pdf output cryptmydoc.pdf owner_pw g456Wsa+dh user_pw IlMioNome

Fatto.

Si tratta di una normale sintassi per utility a linea di comando dove gli argomenti separati da spazi seguono il nome del comando da lanciare e sono strutturati in un primo gruppo costituito dal file di input e da un secondo gruppo composto dal nome da dare al file di output con le opzioni, separati dalla con la chiave ‘output’. Volendo elencare la sintassi potremo costruire l’elenco degli argomenti:

1 – il nome del file pdf da cifrare (nel nostro esempio mydoc.pdf);
2 – la chiave ‘output’;
3 – il nome del file cifrato (tipo ‘crypt_mydoc.pdf’) al quale va applicata la protezione con password (opzione owner_pw seguita dalla password) e l’attribuzione all’utente (opzione ‘user_pw’ seguita dal nome utente).

Procedura operativa: decifratura

Dal punto di vista del destinatario, una volta ricevuta l’e-mail con il documento pdf cifrato, potrà o aprirlo direttamente inserendo la password o riportarlo in chiaro per un utilizzo successivo più agevole, con il comando:

pdftk cryptmydoc.pdf input_pw g456Wsa+dh output mydoc.pdf

Finito.

Anche per questo comando un commento: il primo gruppo di argomenti è costituito dal file da decifrare seguito dall’opzione ‘input_pw’ a cui far seguire la password (altrimenti pdftk non potrà operare sul documento), mentre il secondo gruppo sempre separato dal primo con la chiave ‘output’, è semplicemente il nome da dare al pdf decifrato.

Alcuni screenshot dell’operazione

Ecco cosa viene mostrato se apriamo con Evince, il lettore di pdf predefinito in Ubuntu, un file pdf cifrato:

La richiesta della password per aprire il pdf cifrato con pdftk

La richiesta della password per aprire il pdf cifrato con pdftk

Nel seguente screenshot potete osservare una sessione di terminale per la cifratura ed una decifratura di un file pdf in Linux Ubuntu:

pdftk al lavoro nel terminale di Ubuntu

pdftk al lavoro nel terminale di Ubuntu

Nell’immagine seguente invece vi ho riportato il dialogo di proprietà di Acrobat Reader relativo ad un file cifrato con pdftk dove è chiaramente leggibile che ci troviamo davanti un documento blindato con cifratura a 128bit.

Il pdf è proprio blindato!

Il pdf è proprio blindato!

Evoluzione

Naturalmente vi sono modi di rendere il processo più comodo ed user friendly che convengono solo se si hanno un gran numero di file da gestire con destinatari diversi ognuno con password distinte. Penso per esempio ad un utility di spedizione ad interfaccia grafica che sfrutti un database, cifri i pdf, esegua gli invii dei documenti per e-mail e registri le trasmissioni. Con qualcosa del genere l’intera procedura diventerebbe non solo molto più sicura e professIonale ma anche molto più rapida ed efficiente rispetto alle soluzioni manuali caso per caso in chiaro.

Per approfondimenti sulle opzioni di cifratura offerte da pdftk consultate il suo manuale, mentre per il resto potete commentate il post per riportare esperienze e suggerimenti.
Bene, direi che siamo giunti al termine per cui vi saluto augurandovi buon lavoro!!!

Un modello di pagina per appunti


Prendere appunti

Per qualsiasi studente prendere appunti si rivela un attività importante per utilizzare al meglio i momenti di spiegazione da parte dei docenti, ma anche i partecipanti ad una conferenza od ad un incontro aziendale possono avvantaggiarsi con l’applicazione di un metodo che per forza di cose deve essere personalizzato.

Vi sono diversi metodi che si traducono in un modello di pagina con cui, durante la lezione, applicare le regole che consistono essenzialmente nel rimanere concentrati capendo i concetti che si stanno ascoltando e nel riportarli per importanza e struttura, e nel ripassare il prima possibile per aggiungere particolari e fissare i contenuti.

Il web è una fonte di informazioni utile, ma occorre sempre sperimentare e raffinare. Molto utili per esempio, sono frecce e schemi anche molto semplici, simboli di abbreviazione ed aree di pagina a diversa priorità.

Il modello che ho messo a punto si suddivide in due aree affiancate: la principale detta Notes è quella dove vengono trascritti i concetti principali eventualmente adottando un identazione (a questo scopo utilizzo dei piccoli puntini sulla riga come vedremo tra poco), ed un area laterale destra detta Secondary dove inserire brevi note su curiosità, dettagli od altri riferimenti.

Download modello pagina singola

Download modello pagina fronte/retro

Codice Metapost

Dall’idea di disegnare pagine di quaderno per la scuola elementare, descritta in questo mio post, ne ho tratto il seguente codice Metapost facilmente personalizzabile che realizza il modello descritto.

Il codice è suddiviso in tre sezioni: l’avvio con la definizione dei principali parametri geometrici del modulo, la sezione delle funzioni ed il disegno vero e proprio degli elementi della pagina. Con questa organizzazione, è semplice modificare un parametro iniziale (per esempio la distanza tra le righe Notes), mentre la definizione di funzioni di disegno rende più compatta e concettuale l’operazione di disegno.

Da notare anche come si è fatto uso del font monospaziato Inconsolata utilizzando nel preambolo l’istruzione verbatimtex (che ho tratto da un post del forum del GuIT), quindi per far girare il codice occorre una distribuzione abbastanza completa del sistema TeX, che naturalmente comprende l’eseguibile di Metapost chiamato mpost.

prologues:=3;

verbatimtex
\documentclass{minimal}
\usepackage{inconsolata}
\nofiles
etex; 

outputtemplate := "%j.mps";

% Modello per appunti
beginfig(1)
   
   %%% sezione definizione costanti dimensionali
   
   % dimensione di pagina
   pagewidth := 210mm;
   pageheight:= 297mm;
   
   % margini delle linee area Notes
   sxNotes := 16mm; % sinistro
   dxNotes := 52mm; % destro
   tpNotes := 23mm; % superiore
   btNotes := 15mm; % inferiore
   
   dxSecondary := 10mm; % bordo destro area secondaria
   gap := 2mm;          % distanza linee Notes e Secondary
   
   % distanza dei punti di livello
   d := 12mm;
   
   % altezza linea principale
   q := 6mm;
   
   %%% sezione definizione funzioni

   % funzione di disegno riga orizzontale
   def notesLine(expr y)=
      % spessore linea
      sp := 0.28pt;
      
      % disegno linea
      draw (sxNotes,y+2.25mm)--
           (sxNotes + sp/2,y)--
           (pagewidth-dxNotes-sp/2,y)
               withpen pencircle scaled sp
               withcolor 0.4white;

      % disegno punti di struttura
      drawdot (sxNotes+d,y)
         withpen pencircle scaled 1.5sp
         withcolor 0.4white;

      drawdot (sxNotes+2d,y)
         withpen pencircle scaled 1.5sp
         withcolor 0.4white;
   enddef;
   
   % funzione di disegno riga area Secondary
   def secondaryLine(expr y)=
      % spessore linea
      sp := 0.2pt;
      
      % disegno linea
      draw (pagewidth-dxNotes-sp/2 + gap,y)--
           (pagewidth-dxSecondary-sp/2,y)
         withpen pencircle scaled sp
         withcolor 0.6white;
   enddef;
   
   def labLine(expr a, txt, l)=
      label.urt(txt, a) withcolor 0.5white;
      
      lg := 1pt;
      draw a+(-lg, 4mm-lg)--
           a-(lg, lg)--
           a+(l, -lg)
           withcolor 0.5white;
   enddef;
   
   
   %%% disegno punti di bounding box pagina
   drawdot (1pt,1pt)
      withpen pencircle scaled 0.5pt
      withcolor white;
   drawdot (pagewidth-1pt,pageheight-1pt)
      withpen pencircle scaled 0.5pt
      withcolor white;
   
   %%% disegno modulo degli appunti
   
   % numero di linee del notes
   nn := floor((pageheight-tpNotes-btNotes)/q);
   
   %
   % Notes: area principale linee orizzontali
   for i=0 upto nn:
      notesLine( btNotes + i * q);
      secondaryLine( btNotes + i * q );
   endfor;
   
   refsx := pagewidth-dxNotes+gap;
   labY    := 10.5mm;
   labGap  := 5mm;
   
   % lesson label
   labLine((refsx,pageheight- labY),
          btex \ttfamily Lesson: etex,
          dxNotes-gap-dxSecondary);

   labLine((refsx,pageheight-labY-labGap),
           btex \ttfamily Date: etex,
          dxNotes-gap-dxSecondary);

   labLine((refsx,pageheight-labY-2*labGap),
           btex \ttfamily Page: etex,
          dxNotes-gap-dxSecondary);
   
   % speaker label

   labLine((sxNotes,pageheight-labY),
           btex \ttfamily Speaker: etex,
           pagewidth-dxNotes-sxNotes);

   labLine((sxNotes,pageheight-labY-labGap),
           btex \ttfamily Istitute: etex,
           pagewidth-dxNotes-sxNotes);

   labLine((sxNotes,pageheight-labY-2*labGap),
           btex \ttfamily Contact info: etex,
           pagewidth-dxNotes-sxNotes);
   
   % disegno circoli di foratura
   circleDist := 80mm;
   circleBottom := (pageheight - 3*circleDist)/2;
   
   for i=0 upto 3:
      draw fullcircle
         scaled 4mm
         shifted (12.75mm, i * circleDist + circleBottom)
         withpen pencircle scaled 0.5pt
         withcolor 0.5 white;
   endfor;
   
   % altezza y dei segni mediani dei fori
   circlei := circleBottom+circleDist/2;
   circleii:= circlei+2*circleDist;
   
   % disegno marche orizzontali di foratura
   draw (11mm, circlei)--(14mm, circlei)
      withpen pencircle scaled 0.5pt
      withcolor 0.5 white;
   draw (11mm, circleii)--(14mm, circleii)
      withpen pencircle scaled 0.5pt
      withcolor 0.5 white;
endfig;
end

Buona lezione…

Da Word a jpeg in 10 secondi


Scarica l’articolo in formato PDF per la stampa

Quando una soluzione è …

A dimostrazione di quanto sia ormai affidabile, utile, pratico ed efficiente il software libero vi riporto un piccolo episodio accaduto stamani, quando mi hanno rivolto la seguente domanda “Mi puoi trasformare Word in immagini?”, che tradotto significa voler ottenere le immagini jpeg di ciascuna delle pagine di un documento Word.

elegante per davvero come…

L’unico vero limite del software libero si direbbe sia un fattore esterno ai set di funzionalità ed è questo: la volontà degli utenti di imparare ad utilizzarlo.

Sono disponibili via web manuali, guide e tutorial di efficaci strumenti di lavoro, ma è raro che vengano utilizzati nonostante gli utenti ne conoscano il nome e l’ambito operativo.

Certo, se l’utente usa il solito programma non perderà tempo ad impararne altri, costasse solo il tempo dell’installazione, ma questa situazione in moltissimi casi non è quella ideale quando si possono ottenere risultati migliori, a volte assai migliori, con software di costo zero utilizzati con regolare licenza.

Ma gli strumenti liberi non sono solo un aiuto in sostituzione di altri software a cui siamo abituati. Essi favoriscono una forma mentis con cui l’utente adatta, combina e sperimenta nuove inaspettate soluzioni. Bando quindi alla pigrizia, alla sciatteria informatica e vai con l’inventiva e la qualità fino al dettaglio: il computer non ci sostituisce nel dare eleganza al nostro lavoro

dare un paio di comandi…

Per fortuna, molti software liberi sono multipiattaforma e quindi disponibili anche per Windows, dunque ho aperto una finestra di console dopo aver ottenuto il documento Word in formato pdf a cui ho assegnato il nome di daritagliare.pdf, ed ho digitato un paio di comandi:

>pdfcrop --margin=5 daritagliare.pdf daconvertire.pdf
>convert -density 200 daconvertire.pdf image.jpg

Il primo programma, pdfcrop, fa parte della collezione TeX ed elabora il pdf restituendolo con le pagine prive di bordo, il secondo di Image Magick e produce i file jpeg dalle pagine ritagliate del pdf (i nome dei file vengono numerati). La procedura è indipendente dal numero di pagine, mentre è possibile regolare la risoluzione delle immagini agendo sull’opzione -density.

Ritagliando il pdf prima della trasformazione in immagine, la pagina può essere scontornata perfettamente con pdfcrop, l’utility utilissima di Heiko Oberdiek. Image sarà poi veramente Magick.

Ciao.

Ottenere il PDF di un post di WordPress


Sarebbe utile se…

…ci fosse una maniera semplice e veloce per mettere a disposizione degli utenti del blog il file dell’articolo anche in formato PDF pronto per la stampa!

Che dire, con Lua questo ed altro!

Doverosa premessa

Il problema di convertire il testo tra formati diversi dovrebbe essere già risolto con i tool esistenti. In realtà non è proprio così semplice perché i due formati possono differire semanticamente.

Per esempio se il formato di partenza è html, e si vuol produrre il PDF con LaTeX per assicurarsi la massima qualità tipografica, allora alcune strutture possono non avere un diretto equivalente. Se poi nel sorgente html vi sono alcuni tag propri di WordPress come quelli per il codice che funzionano con Javascript le cose sono di difficile generalizzazione.

Codice

Con i tag specifici di WordPress e con le specifiche che di solito utilizzo, ho risolto scrivendo uno script in Lua che legge il file html, converte i tag in costrutti LaTeX, crea il file sorgente su disco ed infine lo compila con pdfLaTeX, con tanto di sommario cliccabile.

Uniche note di spiegazione che do del codice è l’uso massiccio della funzione string.gsub(), spesso in modo semplice, alcune volte invece con l’uso di funzioni anonime di sottoformattazione come il caso delle formule matematiche (renderizzate da WordPress con LaTeX stesso), e nel caso di inserimento di immagini.

#!/usr/bin/lua

-- 2010 12 15
-- trasforma un file di WordPress dal formato html
-- al formato pdf attraverso LaTeX
--
-----------------------
-- functions section --
-----------------------
local function readFile( fn )
    local f = assert(io.open(fn , "r"))
    return f:read("*all")
end

local function getFilename( s )
   if not string.find(s, "%.") then
       return s
   else
      return string.match(s, "(.*)%.[^%.]-$")
   end
end

local function html2latex( s )
     local result = string.gsub(s, "%[sourcecode%]", "\\begin{lstlisting}")
     result = string.gsub(result, "%[/sourcecode%]", "\\end{lstlisting}")
     result = string.gsub(result, "<h4>(.-)</h4>", "\\subsection{%1}")
     result = string.gsub(result, "<h3>(.-)</h3>", "\\section{%1}")
     result = string.gsub(result, "<h2>(.-)</h2>", "\\section{%1}")
     result = string.gsub(result, "<strong>(.-)</strong>",
                 function (s)
                     return "\\textbf{" .. string.gsub(s, "_" , "\\_") .."}"
                 end
                 )
     result = string.gsub(result, "<em>(.-)</em>", "\\emph{%1}")
     result = string.gsub(result, "%$latex%s+(.-)%$",
                function (s)
                    local s1 = string.match(s,"^\\displaystyle(.*)")
                    if s1 then
                        return "\\[\n" .. s1 .."\n\\]"
                    else
                        return "\\(" .. s .. "\\)"
                    end
                end
               )
     
     -- url substitution     
     result = string.gsub(result,
                          "<a%s+href%s*=%s*[\'\"](.-)[\'\"]>(.-)</a>",
                          "\\href{%1}{%2}")
     result = string.gsub(result,
              "%[caption%s+.-caption%s*=%s*[\'\"](.-)[\'\"].-src%s*=%s*[\'\"](.-)[\'\"].-%/caption%]",
              function (cp,uurrll) return "\\begin{figure}\n\\centering\n"..
                                          "\\includegraphics{" .. string.match(uurrll, "[^/]-$") .. }\n" ..
                                          "\\caption{"..cp.."}\n\\end{figure}\n" end
                                          )
     return result
end

-- create the LaTeX source file
local function makeSource( fn , s )
    -- apertura file
    local f = assert(io.open( fn  .. ".tex", "w"))
    -- scrittura dati
   f:write(s)
   -- chiusura del file
   f:close()
end
-- compile file by name without extension
local function makePDF( fn )
      print("Start pdfLaTeX twin runs...")
      os.execute("pdflatex " .. fn)
       os.execute("pdflatex " .. fn)
       os.remove(fn..".log")
       os.remove(fn..".aux")
       print("End")
end
------------------------------
-- constant strings section --
------------------------------

local preambleDoc = [[
\documentclass[a4paper,10pt]{article}

\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage[T1]{fontenc}
\usepackage[margin=18mm]{geometry}
\usepackage{indentfirst}
\usepackage{microtype}

\usepackage{listings}
\usepackage{xcolor}
\usepackage{inconsolata}
\usepackage{graphicx}
\usepackage[colorlinks=true,linkcolor=blue]{hyperref}

\lstset{%
   backgroundcolor=\color{yellow!20},
   basicstyle=\small\ttfamily,
   framexleftmargin=5pt
}
]]

local openingDoc = [[
% opening
\title{}
\author{The Blogger\\blogger dot email dot mailbox at ecc dot com}
]]

local startDoc = [[
\begin{document}

\maketitle

\begin{abstract}
Articolo dal blog di WordPress
\end{abstract}

\vfill
\tableofcontents
\vfill

\newpage
]]

local endDoc = [[
\end{document}
]]

--------------------------
-- main execution chunk --
--------------------------
local filename = arg[1]

if not filename then
    print("Errore: file d'ingresso non specificato come argomento")
    os.exit()
end

local fname = getFilename(filename)

local contentLaTeX = {}
contentLaTeX[#contentLaTeX+1] = preambleDoc
contentLaTeX[#contentLaTeX+1] = openingDoc
contentLaTeX[#contentLaTeX+1] = startDoc
contentLaTeX[#contentLaTeX+1] = html2latex( readFile( filename ))
contentLaTeX[#contentLaTeX+1] = endDoc

makeSource( fname , table.concat(contentLaTeX) )
makePDF( fname )

-- end of file

Come è ovvio il sorgente LaTeX viene mantenuto nella stessa directory del file html per consentire di effettuare degli aggiustamenti di finezza che solo gli utenti LaTeX sanno percepire 🙂

Bè le ciambelle non sempre vengono col buco… e per applicare lo script a questo stesso articolo ho dovuto intervenire manualmente perché il codice sostituisce anche i tag nel sorgente Lua (cosa da non fare evidentemente).

Poiché capiterà solo per questo post, non correggerò lo script lasciando a voi di proporre la giusta patch.
Scarica questo post nel formato PDF ottenuto con lo script descritto in questo stesso post.
Ciao ed alla prossima.

Watermark di precisione


Cos’è un watermark

Si tratta di una sorta di timbro che viene sovrapposto alle pagine di un documento.
Per ragioni di performance che non vi sto a spiegare, recentemente ho avuto la necessità di sovrapporre un watermark a ciascuna pagina di un file in formato PDF.
Questo post mostra come ciò si possa fare mantenendo la precisione vettoriale, utilizzando i programmi di una distribuzione TeX.

Creare una pagina di mark

(Avete una distribuzione recente di LaTeX installata sul vostro sistema vero?)
Per prima cosa creiamo il watermark, ovvero un file pdf di una sola pagina che contiene il timbro, per esempio una riga che dall’angolo in basso a sinistra della pagina, collega quello in alto a destra.

Per ottenere il watermark, compiliamo il seguente codice:

%
% creating a mark test page:
% copy this code in a text file named watermark.tex
% and compile with the command "pdflatex watermark"
%
\documentclass[a4paper]{minimal}
\usepackage[margin=0pt]{geometry}
\usepackage{tikz}
\begin{document}
\noindent\tikz
\draw (0,0)--(210mm-0.4pt,297mm-0.4pt);
\end{document}

Apporre il sigillo

Ma come apporre il sigillo appena creato?
L’idea è quella di caricare ciascuna pagina del nostro documento (chiamiamolo mydoc.pdf) in un file elaborato con pdflatex tramite il pacchetto pdfpages, ed inserirvi il watermark per ciascuna pagina creata con il pacchetto everypage, scritto da Sergio Callegari (che ringrazio per la sua risposta ad alcuni miei quesiti sul pacchetto).

Da come l’ho descritta sembra un mix di confusione, ma il codice seguente chiarirà più di mille parole cosa intendo:

%%%
% compile this file i.e. named output.tex
% with the command "pdflatex output"
%%%
\documentclass[a4paper]{minimal}
\usepackage{graphicx}
\usepackage{everypage}
\usepackage{pdfpages}

\AddEverypageHook{%
  % traslate the origin
  \vskip -1in\hskip -1in%
  % and with same TeX tricks write the watermark
  \vbox to 0pt{%
     \hbox to 0pt{\includegraphics{watermark}\hss}%
  }\vss%
}

\begin{document}
% the mydoc.pdf file must be present in the same directory
% with the watermark.pdf too
%
\includepdf[pages=-]{mydoc}
\end{document}
%%%

Fatto!

Come funziona

Ad ogni pagina del documento LaTeX, l’effetto del comando \AddEverypageHook del pacchetto everypage, è quello di sovrapporre il file watermark.pdf. Il contenuto del documento vero e proprio consiste nell’istruzione \includepdf[pages=-]{mydoc} (pacchetto pdfpages), che inserisce tutte le pagine del nostro documento, che naturalmente deve essere disponibile come file su disco nella directory prescelta.

Utile per la comprensione è leggersi le guide dei pacchetti utilizzati.
Grazie per l’attenzione ed alla prossima.

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