Conversione di file HTML in PDF [chiuso]


128

Devo generare automaticamente un file PDF da un documento HTML esistente (X). I file di input (report) utilizzano un layout piuttosto semplice basato su tabella, quindi probabilmente non è necessario il supporto per roba JavaScript / CSS davvero fantasiosa.

Dato che sono abituato a lavorare in Java, è preferibile una soluzione che può essere facilmente utilizzata in un progetto Java. Tuttavia, deve funzionare solo su sistemi Windows.

Un modo per farlo è fattibile, ma non produce un output di buona qualità (almeno pronto all'uso) è usare CSS2XSLFO e Apache FOP per creare i file PDF. Il problema che ho riscontrato è che mentre gli attributi CSS vengono convertiti correttamente, il layout della tabella è piuttosto incasinato, con il testo che scorre fuori dalla cella della tabella.

Ho anche dato una rapida occhiata a Jrex, un'API Java per l'utilizzo del motore di rendering Gecko.

Esiste forse un modo per acquisire la pagina di rendering dal motore di rendering di Internet Explorer e inviarla automaticamente a uno strumento di stampa PDF? Non ho esperienza nella programmazione OLE in Windows, quindi non ho idea di cosa sia possibile e cosa no.

Hai un'idea?


3
Di recente ho creato una docbag della libreria Java che può convertire xhtml in documenti pdf. La versione corrente non è nulla di avanzato, ma se i tuoi modelli xhtml sono semplici questa libreria potrebbe tornare utile.
Jakub Torbicki,

Penso che la strada da percorrere sia usare le funzionalità del browser per fare la traduzione. Vedi stackoverflow.com/q/25574082/39998
David Hofmann,

Sono bloccato con la generazione di pdf da un HTML che contiene lettere in cirillico. Va tutto bene tranne le lettere in cirillico che sono state omesse. Chiunque abbia avuto questo tipo di problema?
Kristijan Iliev il

@krisiliev: ho avuto problemi simili e, per quanto ricordo, il font usato è stato molto importante. La maggior parte dei caratteri non supporta i caratteri UTF8 completi, ma i seguenti dovrebbero: 'famiglia di caratteri: Arial Unicode MS;' (CSS). Assicurati anche di utilizzare la codifica corretta (ti consiglierei di usare sempre UTF-8)
panschk,

2
questo link mi ha aiutato hmkcode.com/itext-html-to-pdf-using-java
Mateen

Risposte:


73

Il progetto di rendering XHTML di Flying Saucer ha il supporto per l'output di XHTML in PDF. Dai un'occhiata a un esempio qui .


20
Il vero problema con flying sauser è che lo utilizza per il rendering di PDF, che è una licenza con licenza AGPL v3
David Hofmann,

11
La versione di itext utilizzata da Flying Saucer è la 2.0.8, disponibile sotto LGPL. Solo la versione numero 5 o successiva si trova sulla licenza più restrittiva. stackoverflow.com/questions/2692000/…
Gary,

8
Direi che il vero problema con Flying Saucer è che richiede un documento XML ben formato e valido. È facile rompere involontariamente il rendering PDF includendo qualcosa come una e commerciale nel tuo HTML o un codice javascript che rende il tuo HTML renderizzato non XHTML rigoroso. Sebbene ciò possa essere mitigato con test automatici o alcuni processi che prevedono la convalida XML.
SteveT

3
@LateralFractal Per quanto ne so, Flying Saucer 9.0.8 (l'ultima versione, credo) utilizza iText 2.1.7, che è l'ultima versione di iText con una licenza permissiva --- LGPL. mvnrepository.com/artifact/org.xhtmlrenderer/flying-saucer-pdf/…
Jonathan Crosmer

2
@JonathanCrosmer Sì. Esistono due pacchetti FlyingSaucer per PDF, uno per iText v2 e uno per iText v5. Supponendo che entrambi abbiano la stessa funzionalità; il rischio AGPL può essere incrementato lateralmente.
Frattale laterale

49

Hai provato WKHTMLTOPDF ?

È una semplice utility shell, un'implementazione open source di WebKit. Entrambi sono gratuiti.

Abbiamo impostato un piccolo tutorial qui

EDIT (2017):

Se fosse per costruire qualcosa oggi, non seguirei più questa strada.
Invece userei http://pdfkit.org/ .
Probabilmente spogliandolo di tutte le sue dipendenze nodejs, da eseguire nel browser.


16
Per una semplice conversione da html-page-a-pdf, questo è meglio di ogni altra cosa che ho visto, gratis o commerciale.
MGOwen,

Funziona su un sistema operativo non Mac?
Eran Medan,

1
@Eran, lo usiamo su Linux. Penso che ci sia anche una versione di Windows
Mic

1
@Mic Sì, esiste anche una versione per Windows.
Viccari,

testato su Windows XP (versione 0.9.9) e funziona molto bene. Inoltre, non richiede l'installazione dei diritti di amministratore sulla macchina.
Christopher Mahan,

44

Dai un'occhiata a iText ; si tratta di un puro toolkit Java PDF che supporta la lettura di dati da HTML. L'ho usato di recente in un progetto quando avevo bisogno di estrarre il contenuto dal nostro CMS ed esportarlo come file PDF, ed era tutto piuttosto semplice. Il supporto per CSS e tag di stile è piuttosto limitato, ma rende le tabelle senza problemi (non sono mai riuscito a impostare la larghezza della colonna).

La creazione di un PDF da HTML richiede qualcosa del genere:

Document doc = new Document(PageSize.A4);
PdfWriter.getInstance(doc, out);
doc.open();
HTMLWorker hw = new HTMLWorker(doc);
hw.parse(new StringReader(html));
doc.close();

9
È AGPL, sembra anche peggio di GPL, devi essere open source anche se servi solo il PDF e iText è lato server.
Eran Medan,

10
@Eran, basta usare l'ultima versione non AGPL (com.lowagie: itext: 2.1.7 in Maven).
Nowaker,

1
HTMLWorker è obsoleto nelle versioni più recenti di IText a favore di XMLWorker; tuttavia il supporto CSS è scarso in entrambi i casi (consultare demo.itextsupport.com/xmlworker/itextdoc/… ) e non era adeguato alle mie esigenze. Al contrario, Flying Saucer era perfetto.
Pino,

Puoi utilizzare la versione LGPL che puoi trovare su github.com/albfernandez/itext2
Vladimir Rozhkov,


3

Esiste forse un modo per acquisire la pagina di rendering dal motore di rendering di Internet Explorer e inviarla automaticamente a uno strumento di stampa PDF?

Ecco come funziona ActivePDF , il che è positivo significa che sai cosa otterrai e in realtà ha un supporto di stile ragionevole.

È anche uno dei pochi pacchetti che ho trovato (guardando qualche anno fa) che supporta effettivamente i vari comandi CSS di interruzione di pagina.


Sfortunatamente, il software ActivePDF è molto frustrante - poiché deve avviare il browser IE in background per le conversioni può essere piuttosto lento e non è nemmeno particolarmente stabile.

Esiste attualmente una nuova versione in Beta che dovrebbe essere molto migliore, ma in realtà non ho avuto la possibilità di provarlo, quindi non so quanto sia un miglioramento.


Grazie per la risposta utile Non credo che ActivePDF sia davvero adatto a causa del prezzo, ma è bene sapere che esiste qualcosa del genere.
panschk,

API da HTML a PDF di Grabz : grabz.it/html-to-pdf-image-api.aspx Funziona nello stesso modo in cui esegue il rendering dell'HTML in un browser e quindi crea il PDF in modo da garantire conversioni PDF molto più accurate.
user1474090

2

Puoi usare un firefox senza testa con un'estensione. È abbastanza fastidioso iniziare ma produce buoni risultati.

Dai un'occhiata a questa risposta per maggiori informazioni.


Non sembra una soluzione molto scalabile se si devono convertire le pagine al volo in pdf in parallelo. Se arrivano alcune richieste che si traducono in una conversione tramite FF, il tuo server avrà perso qualche GIG di memoria solo per servire alcune pagine convertite. Questo aprirebbe il tuo server a un DOS.
mP.

Meglio ma simile: github.com/ariya/phantomjs/wiki/Screen-Capture (secondo we-love-php.blogspot.com/2012/12/… il pdf ha un testo reale, non rasterizzato)
nafg

0

Se guardi la barra laterale della tua domanda, vedrai molte domande correlate ...

Nel tuo contesto, il metodo più semplice potrebbe essere quello di installare un driver di stampa PDF come PDFCreator e semplicemente stampare la pagina su questo output.


Come è una soluzione Java? Questo è un driver di stampa per Windows.
Gray

L'OP ha menzionato esplicitamente Windows. E suppongo che ci siano driver simili per altri sistemi. L'OP ha menzionato Java solo come una possibile soluzione ...
PhiLho

0

Amyuni WebkitPDF potrebbe essere utilizzato con JNI per una soluzione solo per Windows. Questa è una libreria di conversione da HTML a PDF / XAML, gratuita per uso commerciale e non commerciale.

Se i file di output non sono necessari immediatamente, per una migliore scalabilità potrebbe essere meglio avere una coda e alcuni processi in background che prendono elementi da lì, li convertono e li archiviano nel database o nel file system.

si applica la normale dichiarazione di non responsabilità

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.