Converting HTML files to PDF

JavaHtmlPdfPdf Generation

Java Problem Overview


I need to automatically generate a PDF file from an exisiting (X)HTML-document. The input files (reports) use a rather simple, table-based layout, so support for really fancy JavaScript/CSS stuff is probably not needed.

As I am used to working in Java, a solution that can easily be used in a java-project is preferable. It only needs to work on windows systems, though.

One way to do it that is feasable, but does not produce good quality output (at least out of the box) is using CSS2XSLFO, and Apache FOP to create the PDF files. The problem I encountered was that while CSS-attributes are converted nicely, the table-layout is pretty messed up, with text flowing out of the table cell.

I also took a quick look at Jrex, a Java-API for using the Gecko rendering engine.

Is there maybe a way to grab the rendered page from the internet explorer rendering engine and send it to a PDF-Printer tool automatically? I have no experience in OLE programming in windows, so I have no clue what's possible and what is not.

Do you have an idea?

Java Solutions


Solution 1 - Java

The Flying Saucer XHTML renderer project has support for outputting XHTML to PDF. Have a look at an example here.

Solution 2 - Java

Did you try WKHTMLTOPDF?

It's a simple shell utility, an open source implementation of WebKit. Both are free.

We've set a small tutorial here

EDIT( 2017 ):

If it was to build something today, I wouldn't go that route anymore.
But would use http://pdfkit.org/ instead.
Probably stripping it of all its nodejs dependencies, to run in the browser.

Solution 3 - Java

Check out iText; it is a pure Java PDF toolkit which has support for reading data from HTML. I used it recently in a project when I needed to pull content from our CMS and export as PDF files, and it was all rather straightforward. The support for CSS and style tags is pretty limited, but it does render tables without any problems (I never managed to set column width though).

Creating a PDF from HTML goes something like this:

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

Solution 4 - Java

If you have the funding, nothing beats Prince XML as this video shows

Solution 5 - Java

> Is there maybe a way to grab the > rendered page from the internet > explorer rendering engine and send it > to a PDF-Printer tool automatically?

This is how ActivePDF works, which is good means that you know what you'll get, and it actually has reasonable styling support.

It is also one of the few packages I found (when looking a few years back) that actually supports the various page-break CSS commands.


Unfortunately, the ActivePDF software is very frustrating - since it has to launch the IE browser in the background for conversions it can be quite slow, and it is not particularly stable either.

There is a new version currently in Beta which is supposed to be much better, but I've not actually had a chance to try it out, so don't know how much of an improvement it is.

Solution 6 - Java

You can use a headless firefox with an extension. It's pretty annoying to get running but it does produce good results.

Check out this answer for more info.

Solution 7 - Java

If you look at the side bar of your question, you will see many related questions...

In your context, the simpler method might be to install a PDF print driver like [PDFCreator](http://www.pdfforge.org/products/pdfcreator "PDFCreator | pdfforge.org") and just print the page to this output.

Solution 8 - Java

Amyuni WebkitPDF could be used with JNI for a Windows-only solution. This is a HTML to PDF/XAML conversion library, free for commercial and non-commercial use.

If the output files are not needed immediately, for better scalability it may be better to have a queue and a few background processes taking items from there, converting them and storing then on the database or file system.

usual disclaimer applies

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionpanschkView Question on Stackoverflow
Solution 1 - JavaMarkView Answer on Stackoverflow
Solution 2 - JavaMicView Answer on Stackoverflow
Solution 3 - Javafred-oView Answer on Stackoverflow
Solution 4 - JavaÓlafur WaageView Answer on Stackoverflow
Solution 5 - JavaPeter BoughtonView Answer on Stackoverflow
Solution 6 - JavarojocaView Answer on Stackoverflow
Solution 7 - JavaPhiLhoView Answer on Stackoverflow
Solution 8 - JavaymsView Answer on Stackoverflow