Quite a coincidence, I've been working on this myself all week
Apart from that JavaWorld article, you may want to look at Flying Saucer or the YaHP Converter. I found the last one the easiest to use and with great results as well. The only drawback is that it is slower than external tools and uses quite a bit of CPU resources. Because it messes with the URLStreamHandlerFactory I've decided to run it as an external tool, launching another JVM from my own (Tomcat) JVM.
If you don't like these you can also use an external tool which you run from the command line, there are several (non-free...) around. Just remember to read the JavaWorld article "when Runtime.exec() won't" if you decide to do this.