Conversione di HTML in PDF con OpenOffice e Word 2007
A quanti di voi non è mai venuto in mente di convertire in modo automatizzato documenti in formato HTML (o anche da altri formati) in PDF? La prima domanda è: cosa utilizzare? Naturalmente un prodotto open source!
A questo punto iniziate la navigazione su Internet alla ricerca di qualche tool o libreria open source per il vostro linguaggio preferito. E qui purtroppo c'è la prima deroga: il vincolo sul linguaggio può implicare un vincolo sul tool/API da utilizzare. Non è detto infatti che esista l'API per il linguaggio da voi preferito.
Ok scegliete un tool o libreria che vi sembra il più adatto: open source, per Java, etc. Ma siamo davvero sicuri che la qualità della conversione sarà soddisfacente? Nel caso di tabelle, immagini e proprietà varie dell'HTML, come si comporterà il nostro tool/API? Nessuno ve lo potrà dire senza fare una prova su strada. E la prova su strada costa tempo e sudore!
Dovete scaricare l'API, studiarvela, sottoporla a test e tutto quello che concerne lo sviluppo di una nuova funzionalità che di banale ha ben poco: affidabilità, efficienza ed efficacia sono dei requisiti indispensabili per un convertitore di tipo batch.
Ma allora quale miglior renderer di un Web Browser o di un Editor di testi che permetta l'esportazione in PDF? Nel caso del browser il vincolo sarebbe proprio sul formato di input: solo HTML. Nel caso invece dell'editor potrete gestire un ventaglio di formati molto più ampio.
Personalmente per la mia prova su strada ho scelto proprio la seconda opzione: editor di testi. Di scelte non ve ne sono poi molte: OpenOffice e/o Word 2007. Il primo è assolutamente free e open source e da tempo supporta la generazione di file PDF; il secondo, assolutamente closed-source e not-free permette da questa versione, appunto la 2007, di convertire qualsiasi documento in PDF grazie ad un plug-in scaricabile alla seguente URL:
Il linguaggio utilizzato per sviluppare il mio test su strada è stato C#. Vi chiederete il perché e la spiegazione è abbastanza semplice: OpenOffice permette tramite degli Assembly di interoperare con le librerie UNO, mentre per Word 2007 la scelta è abbastanza obbligata (se volete rimanere su linguaggi più Java style). Diciamo che la scelta del linguaggio è stata vincolata più a Word 2007 che a OpenOffice essendo quest'ultimo molto più "language-free" del primo.
Per prima cosa create un progetto C# in Visual Studio C# 2008 Express Edition (versione gratuita) o Sharp Develop o anche MonoDevelop (se utilizzate il framework MONO). Poi aggiungete gli opportuni riferimenti alle API UNO per dialogare con OpenOffice. Le librerie per interoperare con OpenOffice UNO sono le seguenti e dovrete cercarle nella directory di installazione di OpenOffice e aggiungerle al progetto C# copiandole in una cartella:
- cli_basetypes.dll
- cli_types.dll
- cli_cppuhelper.dll
- cli_ure.dll
Per Word 2007 invece basta linkare come riferimento la COM:
- Microsoft Word 12.0 Object Library (namespace: Microsoft.Office.Interop.Word)
Per il mio test su strada (creato con Visual Studio 2008 C# Express Edition) la GUI è costituita da una banalissima, nonché minimale, applicazione WinForm. Essa permette di selezionare il motore di conversione da utilizzare: OpenOffice o Word 2007 e poi il file da convertire. La modalità "stress test" permette di provare grossi volumi di conversioni e di rilevare eventuali "problemi" legati all'invocazione silente dell'editor di testi, che di fatto ogni volta apre il documento, lo renderizza e lo converte in PDF. Ecco la schermata dell'applicazione a lavoro:
Di seguito invece alcuni estratti del codice per effettuare la conversione sia con OpenOffice che con Word 2007.
Metodo per la conversione in OpenOffice:
Metodo per la conversione in Word 2007:
Il risultato dei test è stato purtroppo sfavorevole a OpenOffice 2.4 e/o 3.0 e favorevole invece a Word 2007. Il problema di OpenOffice infatti non è stata la qualità di conversione in PDF, assolutamente soddisfacente e paragonabile a quella di Word 2007, ma l'affidabilità del processo di conversione. OpenOffice è entrato in crisi con file HTML di grosse dimensioni (circa 11 Mbyte); alcune volte infatti il processo di OpenOffice è rimasto Hangato senza lanciare alcuna eccezione o terminare. Capite bene quanto questo possa essere spiacevole in un convertitore batch che debba convertire in PDF un numero considerevole di file HTML e anche di grosse dimensioni. E purtroppo lo strano comportamento varia da versione a versione di OpenOffice con leggere variazioni. Personalmente ho provato sia la 2.4 che la 3.0.
Per ovviare a questo problema ho previsto un soglia (Kill #) oltre la quale, prima di avviare il processo di OpenOffice, il precedente (qualora esista) viene killato. La politica scelta è abbastanza semplice ma comunque non è difficile implementare tecniche più raffinate come ad esempio aggiungere un Thread di controllo che provveda, qualora il Thread principale incaricato della conversione non risponda attraverso un segnale al Thread di controllo, a killare il Thread principale e a farlo ripartire.
Come vedete il metodo di kill è abbastanza semplice:
Word 2007 sottoposto agli stessi identici test non ha mai dato nessun cenno di cedimento invece.
In conclusione quello che vi posso dire è questo: se avete bisogno di convertire file HTML (o anche altri formati) in PDF, OpenOffice fa sicuramente al caso vostro, ma fate attenzione ai side effect che potreste avere nella conversione automatica. Altrimenti comprate una licenza di Office 2007 (basta anche la versione standard) e starete sicuramente più tranquilli.