I had the same problem years ago.
This is what I did.
Since my processing was taking place on the server, I knew when the transaction was finished. So what I did was to send the print request directly from the server. The client printer was configured in the server and since it was used in the LAN it could be easily reached. That way I finished with all the problems I had with the applet, the tradeoff was they can only print in the office, but in my situation that was fine, not necessarily applies for you, give it a try.
UPDATE
In my case, the print was needed by different departments along the country.
Each department had an specific, unique printer for that task. So what I did was have that printer mounted in the server filesystem ( in Unix something like /Volumes/printers/EPSON-12345 , in Windows as x:\printers\EPSON-12345 ) When the user finished the transaction in the webapp I start in the server a print request. Java does not have any problem at all to print to a local printer and since a mapped printer is taken as local ( even though it is a remote one ) you don't need further authorizations or anything special.
Since I knew what the specific printers were mapped, and I knew what kind of transaction that was, I knew where to print.
Finally I use a property file to allow the printer to change from time to time and/or add more printers.
I don't quite remember the details but it was something like this in the server:
ResourceBundle bundle = ResourceBundle.getBundle("printers");
String serviceName = bundle.getString("MEXICO.CITY.PRINTER");
PrintService service = PrintService.find( serviceName );
service.print( // document and etc );
But that was almost 4 yrs. ago so I don't remember exactly the details, but my program is still running :)
You can read more about the printing service in java here. It is way much simpler than what it look like.