ULC Printing

Purpose

The intended way how to print from within an ULC application running in a servlet container is to generate a PDF document on the server-side and make this document availabe for download by the client. The PDF document can then be printed like any other PDF document, only depending on the PDF viewer and installed printers.

In more detail, the PDF document is first generated on the server-side using session-specific data. The document is then made accessible to the client via a web server. Finally, the ULC client launches the web browser and queries the browser to fetch the PDF document from the respective web server address.

The described printing functionality can also be used to provide the client with any other kind of dynamically generated resource, e.g. an Excel document containing session-specific numbers.

The Printing utility works transparently in development mode and no web server is needed.

How to use

Implement a Web Resource Provider

We first have to decide whether we can generate in-memory the web resources to be sent to the client. If so, we inherit from MemoryResourceProvider and implement the abstract method createBytes(). Using the PDF library iText, we can generate in-memory PDF documents like shown in the simple example below.

public class PdfMemoryProvider extends MemoryResourceProvider

{
  ...

protected byte[] createBytes() throws IOException { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, outputStream);

document.open(); document.add(new Paragraph("Hello ULC!")); document.close();

writer.flush(); writer.close(); outputStream.close();

return outputStream.toByteArray(); } catch(DocumentException de) { throw new IOException("Could no create PDF document: " + de.getLocalizedMessage()); } } }

In case we cannot generate the web resource in-memory but only write it to a file first, we inherit from FileResourceProvider and implement the abstract method getFile(). Using the PDF library iText, we can generate PDF files like shown in the simple example below.

public class PdfFileProvider extends FileResourceProvider
{

  ...

protected File createFile() throws IOException { try { File file = File.createTempFile(getClass().getName(), ".pdf"); file.deleteOnExit();

OutputStream outputStream = new FileOutputStream(file); Document document = new Document(PageSize.A4); PdfWriter writer = PdfWriter.getInstance(document, outputStream);

document.open(); document.add(new Paragraph("Hello ULC!")); document.close();

writer.flush(); writer.close(); outputStream.close();

return file; } catch(DocumentException de) { throw new IOException("Could no create PDF document: " + de.getLocalizedMessage()); } } }

Register a Web Resource Provider with the Download Manager

Whenever the user wants to print some data, we register an instance of our web resource provider with the DownloadManager using the put() method and we will receive a unique id. We can then call the showDocument() method and pass it the id. This will cause the ULC client to launch the browser and download the web resource returned by the corresponding registered web resource provider.

IResourceProvider pdfProvider = new PdfMemoryProvider(...);

String id = DownloadManager.INSTANCE.put(pdfProvider);

try { DownloadManager.INSTANCE.showDocument(id, "template"); } catch(IOException ioe) { System.err.println("Cannot show document: " + ioe); }

Add the Web Resource Download Servlet to the Servlet Context

Now, all that remains to be done is to add the ResourceDownloadServlet to the same servlet context as the ULC application that triggered the printing. Add the configuration below to your web.xml file.

<servlet>
  <servlet-name>ResourceDownloadServlet</servlet-name>

  <servlet-class>com.canoo.ulc.community.ulcprinting.application.ResourceDownloadServlet</servlet-class>
</servlet>

<servlet-mapping> <servlet-name>ResourceDownloadServlet</servlet-name> <url-pattern>/download</url-pattern> </servlet-mapping>

Resources