Trasformare un HTML in PDF con Chrome lato server

Utilizzando Instant Developer Foundation può capitare di avere l’esigenza di un modello di testo da riempire con dei dati e poi doverlo trasformare in PDF.
Per la prima parte, cioè il merge tra un testo e dei dati posso utilizzare il FileMangler e quindi avere un modello RTF ma poi non ho nulla per trasformarlo in PDF.

Un’alternativa valida potrebbe essere utilizzare un modello HTML che contiene dei testi da sostituire del tipo {{regione-sociale}} che posso riempire con i dati utilizzando la funzione replace().

Poi per convertire il tutto in PDF posso utilizzare il browser Chrome installato sul server web utilizzando il metodo Shell().

"c:\\Program Files\\Google\\Chrome\\Application\\chrome" --headless --user-data-dir="c:\\Pippo"--disable-gpu --no-pdf-header-footer --print-to-pdf="|1"  "|2"

|1 e |2 sono rispettivamente il file di destinazione (PDF) e il file origine (HTML).
L’opzione –user-data-dir permette di indicare la cartella di destinazione del pdf creato (se non esiste la crea Chrome).

In produzione su un server e iis l’opzione –user-data-dir può essere necessaria (in particolare se l’identità dell’application pool è ApplicationPoolIdentity o un altro ruolo speciale) perché quell’utente di sistema non ha un profilo chrome.

In questo caso senza il parametro chrome si avvia ma poi non fa niente e si chiude subito, specificare la cartella di profilo con questo parametro risolve questa situazione.

In questo modo il browser viene utilizzato senza interfaccia grafica.
Naturalmente questo prevede che sul server sia installato Chrome.

5 Mi Piace

Ciao @paolo.giannelli grande latitanza da parte mia, è un periodo tosto.

Tecnica davvero interessante la tua. La devo provare, anzi l’ho provata da cmd.exe e funziona benissimo. Con Shell non mi funziona però.

Noi stiamo mettendo a punto un sistema per convertire da ogni tipo di file a ogni tipo di file usando il document server di onlyoffice. Il problema è che la soluzione è piuttosto non condivisibile perché il motore va installato in un certo modo e a meno di non sposare il nostro sistema custom di deploy su linux, non si può fare. Quando sarà funzionante al 100% magari lo mostrerò.

Ottima l’idea del browser in modalità headless, anni fa per convertire html to pdf lato server con una app delphi e senza poter avviare chrome ma usando chromium embedded ho davvero faticato, per quanto alla fine funzioni.

Grazie. Ciao!

1 Mi Piace

Correggo, funziona anche con shell, semplicemente sbagliavo l’ordine dei parametri.

1 Mi Piace

Molto interessante, è un’idea che non mi era mai venuta in mente.
Sicuramente lo userò in qualche progetto…
Grazie!

1 Mi Piace

@francesco.guarnotta sono quelle idee che ti vengono per caso, cercavo un convertitore html to pdf e mi ricordavo di questo wkhtmltopdf.org che non viene più aggiornato e quindi continuando nella ricerca in un forum mi sono imbattuto in questa cosa.

noi abbiamo creato una cloud function con puppeteer che alla fine ha alla base chromium e quindi chrome. In questo modo riusciamo a richiamarla da tutti i progetti installati su server diversi.

2 Mi Piace

@donatz mi sembra una buona strategia così non si deve installare Chrome su tutti i server dove pubblichi.

Ho aggiunto l’opzione --user-data-dir al post principale che può tornare utilie.

Mi permetto di aggiungere un’informazione: in produzione su un server e iis l’opzione --user-data-dir può essere necessaria (in particolare se l’identità dell’application pool è ApplicationPoolIdentity o un altro ruolo speciale) perché quell’utente di sistema non ha un profilo chrome.

In questo caso senza il parametro chrome si avvia ma poi non fa niente e si chiude subito, specificare la cartella di profilo con questo parametro risolve questa situazione.

2 Mi Piace

Grazie @giuseppe.lanzi la aggiungo anche al post iniziale.

Basato sullo stesso concetto abbiamo integrato ad inde foundation un progetto che permette di esportare anche in docx, excel etc… : jsreports ( https://jsreport.net/ ). Essendo un progetto già maturo si trovano molte opzioni già pronte

2 Mi Piace