Ask HN: What do you use for PDF reports these days?

94 points by jguimont ↗ HN
I am creating some entreprise software and almost every other information needs to be sent by email in pdf format. Reports, invoices, etc. I am using whtmltopdf right now, but it is far from ideal.

My idea setup would be to create some template with fixed parts, growable parts (texts that can vary in size), repeatable parts (lines in a table). And then just feed the data to have a nice pdf built.

The closest I found was using LibreOffice to convert a document to pdf (http://railsblog.kieser.net/2013/04/part-ii-creating-beautiful-reports-in.html).

It seems PDF generation should be a solved problem. Maybe, Adobe LiveCycle is doing exactly what I need, but it is not open source and I do not have $50k to find out.

What are you guys using?

62 comments

[ 5.5 ms ] story [ 114 ms ] thread
For Reports with lots of tables and mathematics: generate LaTeX file -> PDFTEX to PDF using MiKTeX
Even without math, LaTeX is a pretty nice way to generate documents. Especially with TikZ, you can get really nice autogenerated figures too.
Agreed. LaTeX is the best (well, least-worst) report generating system, mostly because of its extensive ecosystem. It's well-supported in multiple languages, and there are packages for just about everything.
I use this for invoices in my homegrown invoicing system. I also have a script for generating PDF & HTML versions of my resume from the source data, and the PDF version goes through LaTeX. If you're using Ruby, prawn is a nice solution also, but my favorite is going via LaTeX.
Jasper works pretty well and gives you a designer, but you could also roll your own like Aheinemann says. I've done the wkhtmltopdf road before and it was tough to deal with paging.

I'm working on a related problem right now (end-user report design in the browser) so I'll be interested to see what other people say.

ReportLab.
Thanks for the recommendation. I can't believe I didn't know this existed, especially considering Wikipedia use it!
Our rails app generates dozens of accounting related reports on the fly in HTML and we use Flying Saucer to generate a PDF version -

https://github.com/flyingsaucerproject/flyingsaucer

To help minimize request time, we keep Flying Saucer persisted with Nailgun -

https://github.com/martylamb/nailgun

For generating checks, IRS forms and other PDFs that involve precise formatting we use Prawn -

https://github.com/prawnpdf/prawn

Hey! Flying Saucer! I wrote the first version of that almost a decade ago. I'm so happy to see people are still using it.
Use it on the JVM here, quite the god send, thanks for bringing it into being ;-)

We provide PDF reports generated from various stat pages on our site for NHL and college hockey scouts.

Performance is excellent, no caching required, and the implementation is seamless, just feed html directly to FS and voila, on-the-fly PDF reports.

there is always itext / itextsharp. or pdflib. i think ghostscript does pdf conversions as well.
(comment deleted)
PDFsharp is a pretty good opensource library for .NET languages.
Docraptor, http://docraptor.com

It uses the Prince engine (http://www.princexml.com/), so it supports paging, headers, footers, page numbers etc. in addition to standard HTML+CSS3. It's great overall but quite pricey.

I highly recommend Prince/Docraptor as well. However, if you don't have complex layout needs and don't need CSS3 features use wkhtml2pdf. You just have to dynamically layout the page you need and use pass it thru wkhtml2pdf. There are many gems if you are using Rails.
We're also using Prince, love it. We've previously used PdfCrowd and wkthml2pdf, but our customers were demanding more control of their reports (detailed footers, repeating headers, table of contents).
I'd also recommend this, with the caveat that the built in javascript rendering engine isn't that great. The workaround is to load the page with phantomjs, and then send the computed DOM (w/ the JS stripped out) to DocRaptor / Prince.
Generate SVG using an XML DOM library and then convert to PDF using Inkscape on the command-line.
I use PrinceXML, which is a few hundred or a few thousand depending on what you need, instead of fifty thousand. Prince converts [html/xml + css] to PDF, and has the most complete CSS3 implementation I'm aware of by a green mile.

There's a free version you can experiment with, to find out.

Basically seems like if you're going to be using docraptor heavily, you might as well buy a license and the underlying technology yourself, right?
I mean, I don't really have an opinion on DocRaptor. It seems convenient and it might be what people want.

I wanted a local tool which I could script. Also I bought Prince years before DocRaptor existed. (That guy is in the Prince forums and he's pretty cool, and I like his product.)

I just wanted a command line tool though, and that's part of what you get from a personal license.

Fun fact: the (Australian) company supporting Prince has the (Norwegian) Håkon Wium Lie as director -- CTO of Opera and the proposer of CSS (see recent article https://news.ycombinator.com/item?id=8436659 ).

Håkon / Haakon being a common name, coincidentally the Norwegian crown prince is also named that. So searching for "haakon prince" has two quite different meanings.

What's wrong with WkHtmlToPdf? It is pretty damn good in a "it just works" way.
I'm in a similar boat to OP, so I would be interested to know as well as far as what didn't go so well with wkhtmltopdf.
We use it here and have found it to be very flexible. We render a DOM in memory which we can then turn in to a variety of formats: markdown, html, pdf etc.
To me, no selectable text and full page background images.
We use reportlab (https://pypi.python.org/pypi/reportlab) for invoice generation. Once you decide upon the template it's very easy to use.
Using it too, you can easily create templates in the "TRML" file format including headers/footers etc. It supports table breaking in the middle with repeating headers, this is really useful when you generate invoices or tables of data.
Honestly, I've been Chrome's print to PDF + Quartz Filter to compress JPEGs for over a year.

These are the most important tricks:

  .A4page {
	width: 793px;
	height: 1120px;
	position: relative;
	padding: 200px 50px 50px;
	box-sizing: border-box;
  }

  @media all {
	.page-break	{ display: none; margin-bottom: 100px; }
  }

  @media print { 
	.page-break	{ display: block; page-break-before: always; }
  }

Good font rendering, selectable text. Not perfect, but the best I've seen so far.
That's basically what wkhtmltopdf does.
I run http://template2pdf.com/ as a side project.

Take a LibreOffice/OpenOffice document as your template and send a simple http request with the values you want to replace (with support for images and what you call 'repeatable parts'). The system will then return a link where you can pick up your generated pdf.

In the one place where I need to create PDFs from code (generating address labels), I use the fpdf port of Python. It is probably too limited for most cases, but if you just need to position some simple images and text it might be enough.

https://code.google.com/p/pyfpdf/

I'm using Org-mode which can export to LaTeX -> PDF [0]. I use Org-mode for invoices [1], reports, time-tracking, etc. Using org-babel you can use Gnuplot[2] or R [3] to embed charts and other visuals.

[0]: http://orgmode.org/manual/LaTeX-and-PDF-export.html#LaTeX-an...

[1]: http://orgmode.org/worg/org-contrib/

[2]: http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-g...

[3]: http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-R...

Do you have any idea how much memory/cpu does this conversion takes? We use wkhtmltopdf for an enterprise app but it's slow and takes too much memory. Latex -> PDF does sound very appealing.
I haven't personally run any memory or cpu performance tests. There are online LaTeX editors out there; ShareLaTeX comes to mind. My point being that if online services like ShareLaTeX exist, then the conversion process shouldn't be horribly slow. As always, YMMV.
I use pdfkit.js: http://pdfkit.org/

You can run it directly on the client (or the server, if you like), which is really nice.

I've used PhantomJS with CoffeeScript, and Reportlab with Python.

The PhantomJS solution became a bit painful, since there are issues with the way Qt converts HTML into PDF. I was impressed that even SVG generated with D3 faithfully was converted to PDF. But not being able to precisely control formatting was a problem.

After that I decided to try Reportlab, and it's been amazing. There is a free open source Python API version, and the commercial Report Markup Language product (RML). It's possible to mix Python and RML with a template engine (Preppy), very powerful. We opted for the commercial support, since time was a factor. RML is really baked, it's been around for over a decade. The documentation is extensive, but I still had to find a couple of things via googling. However, their commercial support is awesome.

If you don't want to spend a lot of time handcrafting documents, I recommend RML, despite the cost. It has features for page layout control, fonts, tables, styling and multipage text flow. There's even a charting library, which I didn't use yet. Also important was the ability to include existing PDF pages as backgrounds or chart inserts.

Microsoft Sql Server Reporting Services - does everything you mentioned and exports to pdf

same for Business Objects, but IMHO needlessly more complicated than the former.

obviously neither are open source, and an SSRS license is worth it if your business spits out many reports.

SSRS is a beautiful piece of software.

SQL Server Express with Advanced Services ships with SSRS, is free, comes with all the tooling and generates PDFs too.

Perhaps surprisingly, if you install your ODBC drivers for your database engine (MySQL, Postgres etc) you can create a report from that data source as well so you're not tied to SQL Server as a database engine.

Typical steps: http://www.mssqltips.com/sqlservertip/2615/creating-a-ssrs-r...

And report builder: http://www.youtube.com/watch?v=Iy-bE0yXGlk

Can't beat it for $0.

Microsoft Sql Server Reporting Services - does everything you mentioned and exports to pdf

same for Business Objects, but IMHO needlessly more complicated than the former