<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>byte bohemian &#187; The Flying Saucer Project</title>
	<atom:link href="http://nicl.net/category/the-flying-saucer-project/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicl.net</link>
	<description></description>
	<lastBuildDate>Sat, 15 May 2010 20:51:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Creating dynamic PDF, or another reason to like Apache Tapestry</title>
		<link>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/</link>
		<comments>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 20:40:29 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[The Flying Saucer Project]]></category>

		<guid isPermaLink="false">http://nicl.net/?p=45</guid>
		<description><![CDATA[I am using Apache Tapestry 5 on my job since February of this year. Today was another of these days when I am pretty sure why it is a good idea to use this framework.
Last week we started the new sprint for the scoyo feature release which will be release on end of September. A [...]]]></description>
			<content:encoded><![CDATA[<p>I am using <a href="http://tapestry.apache.org/">Apache Tapestry 5</a> on my job since February of this year. Today was another of these days when I am pretty sure why it is a good idea to use this framework.<br />
<span id="more-45"></span>Last week we started the new sprint for the <a href="http://www-de.scoyo.com">scoyo</a> feature release which will be release on end of September. A website feature may require the dynamic creation of PDF files so I evaluated the possibilities of the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a>, a XML/XHTML/CSS 2.1 rendering engine.</p>
<p>I already made some experiences with the <a href="https://xhtmlrenderer.dev.java.net/">Flying Saucer</a> on another job and it is still a very nice framework for PDF creation. For me, a major advantage of <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer"</a> over other PDF creation frameworks, like XSLT and <a href="http://xmlgraphics.apache.org/fop/">FOP</a>, in the Web world is the homogenous technology mix.</p>
<p><a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a> create PDF from XML/XHTML pages using CSS style sheets. All technologies known to the web designer that gives your web site this pretty look. I guess it's okay when you say, that XSLT and <a href="http://xmlgraphics.apache.org/fop/">FOP</a> is the more powerful technology mix, but styling pages on this technology mix is not a simple task to do.</p>
<p>So back to the initial topic: A basic ingredient which is needed to create PDFs with the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a> is some XHTML. In our project at <a href="http://www-de.scoyo.com">scoyo</a> we wanted to use <a href="http://tapestry.apache.org/">Apache Tapestry</a> to create this XHTML.</p>
<p>After taking a closer look to the <a href="http://tapestry.apache.org/">Apache Tapestry</a> rendering pipeline I found out, that the <code>PageResponseRenderer</code> is the perfect place to hook up the PDF creation into the rendering process. On the one hand the <code>PageResponseRenderer</code> uses a <code>MarkupWriter</code> to create the (X)HTML content from the current <code>Page</code> instance. On the other hand the <code>PageResponseRenderer</code> is responsible for writing the generated content into the server response.</p>
<p>Using the <a href="http://tapestry.apache.org/">Apache Tapestry</a> own IoC mechanism it's quite an easy task to decorate the <a href="http://tapestry.apache.org/">Tapestry</a>  <code>PageResponseRenderer</code> implementation. It's a beautiful mechanism when you understood how it works. Okay I guess using the 5.1 version of tapestry it would be better to advice the <code>renderPageResponse(...)</code> method, but I had not enough time to get familiar with it yet.</p>
<p>One real big plus on <a href="http://tapestry.apache.org/">Apache Tapestry</a> is the implementation. Every function is well encapsulated into separate services. And the service implementing classes are very short and almost always on consistent level of abstraction. So you easily understand how a service works and you are able to copy and extend the service functions. So I extended <code>PageResponseRenderer</code> to determine if a page creates XHTML output which should be transformed to PDF. If no PDF should be created my <code>PageResponseRenderer</code> simply delegates to the original Tapestry instance.</p>
<p>When the page wants to create PDF my <code>PageResponseRenderer</code> buffers the created content and redirects it into the <code>ITextRenderer</code> of the a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer". Okay this sounds more nice, than it actually is. The content is stored into a <code>ByteArrayOutputStream</code> and re-parsed by the standard JDK XML parser for further processing by the <code>ITextRenderer</code>. But I guess the we will live with the performance impact until it gets a real issue.</p>
<p>So long explanation short story. The whole thing worked out great! It took me like two to three hours to implement a first prototype. In out web application. This also includes the embedding of custom fonts into the PDF and a nice discovery of pages to render into PDF, via custom annotations using the component model meta-data facilities and a <code>ClassTransformationWorker</code>.</p>
<p>Web development can be so easy when you are using <a href="http://tapestry.apache.org/">Apache Tapestry</a>. On an earlier project we used a similar architacture with JSP and the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer"</a>. I guess it took us ten times the effort to establish an equal infrastructure using JSF and the Java Servlet API ...</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
