Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Tapestry Wiki" for 
change notification.

The following page has been changed by DanielJue:
http://wiki.apache.org/tapestry/Tapestry5HowToCreateADynamicPDF

New page:
== Creating a Runtime Generated PDF ==

Here is a simple example of how to generate a PDF that gets streamed back to 
the user's browser.
The main code was from an email exchange on the Tapestry User mailing list.
This is similar to other examples that use !StreamResponse for generating 
images and charts for the user.

=== Dependencies ===
This example uses the Lowagie IText library for generating the PDF.  
It's hard to find a current version on maven repositories, so you will probably 
have to manually install it into your local maven repository.
Please refer to the Maven documents on how to to manually add to your 
repository using mvn.  You'll have to download the library from an online site. 
 Google it.  This is the same as with !JFreeCharts.
(Alternatively, you could just put the jar somewhere in your class path, if you 
are just testing things out.)
{{{
        <dependency>
                <groupId>com.lowagie</groupId>
                <artifactId>itext</artifactId>
                <version>2.0.2</version>
        </dependency>
}}}


=== PDFWriterPage.html ===

First we have a very simple page.  Notice that we've set the target to be a new 
window or tab.  When the user click on the link, the PDF will be generated.
{{{
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd";>
        <head>
        <title>PDF Writer test page</title>
        </head>
        <body>

        <t:form t:id="doReportsForm" action="reportsForm" target="_blank">

                <t:submit t:id="onSubmit" name="Run Report" value="Run Report" 
/>

        </t:form>
        </body>
</html>
}}}



=== PdfWriterPage.java ===

Here is the Java class behind the simple page.  It is here that you would 
supply the custom data for your PDF, or at least direct an object's output into 
the PDF generator.  With a little work, you can use this for exporting the 
contents of a Grid component, for example.  PDF is a hugely complicated 
format--the spec is bigger than a phone book.  The Lowagie IText library makes 
it easy, and it's free.
{{{

import java.io.InputStream;

import myapp.model.services.PDFGenerator;
import myapp.model.services.util.PDFStreamResponse;

import org.apache.tapestry.StreamResponse;

public class PdfWriterPage {
        public StreamResponse onSubmit() {
                // Create PDF
                InputStream is = PDFGenerator.generatePDF("Dynamically 
Generated PDF");
                // Return response
                return new PDFStreamResponse(is);
        }
}
}}}

=== PDFGenerator.java ===

This is the class that takes care of your streams, and accepts your custom 
data.  It returns a specific kind of stream for your page (!PDFWriterPage ) to 
use.  
{{{

package myapp.model.services;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public class PDFGenerator {

        public static InputStream generatePDF(String teststring) {
                // step 1: creation of a document-object
                Document document = new Document();

                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                try {
                        // step 2:
                        // we create a writer that listens to the document
                        // and directs a PDF-stream to a file
                        PdfWriter writer = PdfWriter.getInstance(document, 
baos);
                        // step 3: we open the document
                        document.open();
                        // step 4: we add a paragraph to the document
                        document.add(new Paragraph(teststring));
                } catch (DocumentException de) {
                        System.err.println(de.getMessage());
                }
                // step 5: we close the document
                document.close();
                ByteArrayInputStream bais = new 
ByteArrayInputStream(baos.toByteArray());
                return bais;
        }
}

}}}

=== PDFStreamResponse.java ===

This is the type of object that the method in your page will return.  Note the 
getContentType() method.  If you are planning on returning something else, like 
a jpg, zip, mp3, etc., you will need to find the appropriate content type 
String for that.  Otherwise, if it is wrong or blank, your browser may display 
it incorrectly or give you an error.  These content types help trigger plugins 
associated with your browser.
{{{

package myapp.model.services.util;

import java.io.IOException;
import java.io.InputStream;

import org.apache.tapestry.StreamResponse;
import org.apache.tapestry.services.Response;

public class PDFStreamResponse implements StreamResponse {
        private InputStream is;

        public PDFStreamResponse(InputStream is) {
                this.is = is;
        }

        public String getContentType() {
                return "application/pdf";
        }

        public InputStream getStream() throws IOException {
                return is;
        }

        public void prepareResponse(Response arg0) {
                // TODO Auto-generated method stub
                
        }
}

}}}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to