2012-10-02 17 views
15

Sto cercando una soluzione per generare un PDF da un documento HTML5/CSS3, lato server.HTML5 a PDF serveride

So che c'è un sacco di soluzioni per la creazione di un PDF (come FOP, iText ...), ma ho bisogno di assicurarmi che sembrerà al 100% lo stesso della pagina HTML. Quindi, non voglio creare un elemento PDF per elemento come FOP o iText.

In realtà, qualcosa dovrebbe esistere perché è quello che si fa quando si stampa come PDF dal browser. Idealmente, la soluzione dovrebbe incorporare un motore di browser Web (webkit o gecko). Ho provato wkHtmlToPdf ... ma il risultato non è affatto buono (la tela HTML5 non è nemmeno stampata ...)

Se qualcuno ha un'idea di una soluzione, gratuita o meno, qualsiasi lingua ... Lo farò apprezzare MOLTO! Grazie !!

+0

Perché questo è ancora chiuso ?? Ogni domanda provoca più "sollecitare dibattiti, discussioni, sondaggi o discussioni estese" di questo. –

+1

wkhtml2pdf ora * fa * render canvas ... vedi wkhtmltopdf.org. Complimenti per wkhtml2pdf ... è semplicemente fantastico avere un solo eseguibile invece di trattare con 7000+ classi java di fop –

risposta

0

Che lingua stai utilizzando lato server?

Creare uno screenshot della pagina e quindi convertire l'immagine in un pdf probabilmente ti darà i risultati migliori. Mostrerebbe la pagina esattamente come sarebbe stata resa da un browser.

Ci sono alcuni strumenti Screenshot-as-a-Service, come browshot.com. Dai uno sguardo allo API e allo supported languages.

Oppure puoi utilizzare il tuo strumento. Per node.js esiste un bel progetto su github.

+0

Grazie per la tua risposta. Sto usando Java sul lato server, ma sono aperto a usare qualcos'altro per questa generazione di PDF. Sfortunatamente, lo screenshot non è un'opzione, perché il pdf generato dovrebbe essere un vero PDF per una stampante professionale (ad esempio, il testo dovrebbe essere testo, non alcuni pixel). – Olivier

+0

La conversione di un'immagine in PDF è davvero una pessima idea: perderai tutto il testo, quindi non si ingrandirà bene e non sarà copiabile/incollabile o ricercabile. Renderà anche il file PDF più grande di quanto non sia necessario. Se si utilizza wkHtmlToPdf o phantomJs o un'opzione di stampa normale del browser, il testo andrà nel PDF come testo e qualsiasi grafica vettoriale andrà anche come vettori, evitando questi problemi. – rjmunro

1

A seconda della complessità del codice HTML è possibile utilizzare XmlWorker, che è un progetto degli sviluppatori iText e utilizza iText.

23

Ho usato PhantomJS per generare immagini PNG da pagine Web e può anche produrre PDF e la qualità è generalmente buona. La proprietà è chiamata screen capture e descritta here. I formati supportati sono PNG, JPEG, GIF e PDF.

Quando convertiti in PDF, i testi delle pagine vengono conservati come testi.

Dopo aver provato poche altre librerie o programmi, ha trovato PhantomJS la soluzione più perfetta. PhantomJS utilizza WebKit, un vero motore di layout e rendering.

Alcuni esempi sono in https://github.com/ariya/phantomjs/wiki/Examples. Nella sezione rendering/rasterizzazione si è menzionato il seguente script che si aiuta nel processo:

rasterize.js rasterizes a web page to image or PDF 

PhantomJS QuicStart Guide dice:

Produrre output PDF è possibile, ad esempio, da un articolo di Wikipedia:

phantomjs rasterize.js 'http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes' jakarta.pdf 

o durante la creazione di stampante pronta foglietto:

phantomjs rasterize.js http://www.nihilogic.dk/labs/webgl_cheat_sheet/WebGL_Cheat_Sheet.htm webgl.pdf 

ho provato pdf-generazione di poche pagine e se la pagina segue gli standard, produce buoni risultati. Il testo è selezionabile e stampabile come di alta qualità, ma su alcune pagine il layout in pdf non è lo stesso di png.Sotto è due schermate che vengono generati utilizzando comandi:

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.png 

$ phantomjs rasterize.js 'http://windows.microsoft.com/en-US/windows/home' microsoft.pdf 

Example of png and pdf generation using Phantomjs

ho testato anche http://lab.simurai.com/buttons/. Il pdf e il png erano molto identici e di seguito è riportato un esempio di pdf che ho rasterizzato a 5641 px di larghezza e ne ho ritagliato una regione. Come nel precedente esempio PDF, il testo è selezionabile in PDF e, come vedi, il testo è nitido (niente antialias!).

CSS3Buttons

INSTALLAZIONE

ho provato prima di installare librerie Qt e PhantomJS su Centos5 compilazione dai sorgenti, ma senza fortuna. Poi su Ubuntu 11.10 e il processo è stato indolore:

ho scaricato http://phantomjs.googlecode.com/files/phantomjs-1.7.0-linux-x86_64.tar.bz2 ed estratto utilizzando

tar -xjvf phantomjs-1.7.0-linux-x86_64.tar.bz2 

E poi copiato phantomjs eseguibile a bin dir del sistema:

$ cp phantomjs-1.7.0-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs 

e phantomjs ero pronto correre.

Se il PDF generato non è buono, si può provare ad aggiornare Webkit, ma suppongo che il risultato dovrebbe essere sufficiente. Il PhantomJS ha un ciclo di aggiornamento eccellente, quindi i bug dovrebbero essere corretti in tempi ragionevoli.

PhantomJS FAQ ha anche buone informazioni sulle possibilità.