martedì 11 dicembre 2018

Da HTML a PDF con WkHtmlToX

Delphi WkHtmlToX Library

In un progetto su cui sto lavorando da qualche tempo avevo bisogno di trasformare file HTML in PDF. Cercando un po’ in giro mi sono imbattuto in  WkHtmlToPdf. WkHtmlToPDF e WkHtmlToImage sono due tool open source (LGPLv3.0) che permettono, tramite il rendering engine WebKit, di trasformare delle pagine HTML in PDF o immagini.

Scaricando il software si trovano sia i due tool a linea di comando che una DLL. Dovendolo integrare in un progetto Delphi ho cominciato a tradurre l’API e di seguito a scriverci sopra un piccolo wrapper che ne semplificasse l’uso. Trovate il tutto su GitHub pubblicato con licenza apache (fondamentalmente potete farci quello che volete). Nella directory sample ci sono 4 demo:

  • ApiDemo: programma di test che usa direttamente le API di WkHtmlToX
  • WrapperDemo: stesso esempio ma che usa la classe IWkHtmlToPdf
  • ThreadedDemo: un esempio di implementazione thread-safe
  • StreamDemo: esempio che usa un HTML in memoria invece che su file

Configurazione


Il tool comprende una miriade di opzioni di configurazione:

  • Dimensione e orientamento della pagina
  • Impostazione dei dpi
  • Impostazione dei margini della pagina
  • Possibilità di personalizzare intestazione e piè pagina
  • Abilitare o meno JavaScript
  • Possibilità di usare un CSS personalizzato
  • Ignorare lo sfondo della pagina

Per l’elenco completo dei parametri di configurazione potete far riferimento a questa pagina:
https://wkhtmltopdf.org/libwkhtmltox/pagesettings.html

Problemi noti


Il tool funziona piuttosto bene, anche con pagine complesse, in effetti il motore di rendering è lo stesso di google chrome. Ci sono un paio di problemi. Uno è che la libreria non è thread-safe. Nell’esempio ThreadedDemo trovate un workaround che permette di usare WkHtmlToX  in più thread senza bisogno di lock. L’altro problema è che se invece di convertire un file gli passate l’HTML come stringa o in uno stream non viene rilevato correttamente l’encoding. Anche questo problema può essere aggirato aggiungendo un tag <meta> alla pagina. Trovate un esempio del demo StreamDemo.

Download


Pagina del progetto: https://github.com/lminuti/Delphi-WkHtmlToX
Pagina dove scaricare la DLL: https://wkhtmltopdf.org/