I'm new to JasperReports and find myself getting pretty lost with it. I've got a webapp in JSF that I want to use to print a PDF. I've built the report, and am able to successfully compile and fill it with all my parameters. However, I'm lost on the actual output portion. I'd like it go to a printer as a PDF. I don't care about ever seeing it on screen, straight to printer would be the ideal (from the server would be ideal, but client would also be fine as we could setup the clients to print as necessary (it's an internal app)).
Answers
I finally worked it out.
I can't post my code here, but here's what I did:
I rendered the PDF onto 2 canvases, one small for the thumbnail and one huge for printing (hidden). I then had a print button that opened a new window containing an img
tag containing the contents of the huge canvas using toImageURL()
. The print()
function was called on the new window, followed by close()
to close it automatically once printed.
This resulted in an almost-full-size print of the PDf, albeit with the usual page no and datestamp from the browser.
To answer my own question ...
After 3 days of trial and error I dont think there is any chance to configure the printer via .NET and print PDFs afterwards. You cant use the System.Drawing.Printing.PrintDocument class in combination with PDFs, but using PrintDocument seems to be a prerequisit to change the printer settings.
My solution to configure the printer was inspired by this post on codeplex: http://www.codeproject.com/KB/dotnet/NET_Printer_Library.aspx
To finally print the pdf I send it via commandline parameters to Adobe Reader.
Thanks to the suggestion by @Al-Mothafar, I have finally solved my issue in the following way:
index.xhtml
...
<h:body>
<script type="text/javascript" src="resources/Javascript/jquery/jquery-1.7.2.js" />
<script type="text/javascript" src="resources/Javascript/MyJS.js" />
<script type="text/javascript" >
var myBeanProperty = '#{myBean.myProperty}';
</script>
</h:body>
MyJS.js
$(document).ready(function() {
alert(myBeanProperty);
});
put index.jsp
and in it put
<% response.sendRedirect("desired URL"); %>
remove
<welcome-file-list>
<welcome-file>CentralFeed.jsf</welcome-file>
</welcome-file-list>
from web.xml
You can't do it with plain HTML/CSS/JS. As JSF is basically just a HTML/CSS/JS code generator, it can't do any magic for you. Closest what you can get is JavaScript's
window.print()
, but that would still show the user the printer settings and such (basically, it does the same asCtrl+P
).Your best bet is to create an Applet which uses the
javax.print
API and then embed that Applet in your JSF page by HTML<applet>
or<object>
tag.If you can live with seeing it straight on screen and delegating the print job to the enduser itself, then you can send a PDF file to screen by JSF as follows:
I have never worked with JasperReports, so the
yourJasperReportsClass.writePdfTo()
was just a random guess, but the hint should be clear enough. You basically need to instruct it to write the PDF to the response body.Update: as per the comments, that printer is actually connected to the server, not to the client and you actually want to let the server print it to its printer. In that case, just use the
javax.print
API. At the bottom of that document you can find some code examples. Here's an extract of relevance:It's not relevant if the above code called by a JSF managed bean. It's after all just Java. You might only want to modify the
DocFlavor
and other settings.