/struts2-pdfstream

A Struts2 plugin for creating PDF-s from HTML-s, JSP-s, FreeMarker templates and Apache Tiles definitions.

Primary LanguageJavaApache License 2.0Apache-2.0

Struts2 PDF Stream Plugin

Maven Central License

The PDF Stream plugin allows to transform a view into a PDF stream and return it as a result from Action.

Default supported views:

  • HTML
  • JSP
  • FreeMarker template
  • Apache Tiles definition

Struts2 PDF Stream v2

Apache PDFBox 2

Starting from 2.0.0, HTML into PDF rendering is done by the openhtmltopdf library which uses the Apache PDFBox 2 to create PDF documents. Apache PDFBox 2 is an open source Java tool for working with PDF documents and it is published under the Apache License v2.0.

Apache Struts 2.5

Upgraded to be compatible with Apache Struts 2.5

Java 7

Switched to Java 7

Features Overview

  • Direct transformation of HTML, JSP, FreeMarker template and Apache Tiles definition to PDF via Struts2 result
  • PDF content styling using CSS
  • Support of wide range of characters in PDF thanks to the DejaVu fonts
  • Handling of the malformed HTML thanks to the jsoup

Showcase

Showcase application can be downloaded from the Maven Central Repository.

Download struts2-pdfstream-showcase

Contributing

Found a bug or have a feature request? Create a new issue or submit a Pull Request.

Questions

If you have questions about how to use struts2-pdfstream-plugin create a new issue or ask a question on Stack Overflow.

Installation

Copy following jars into your classpath (WEB-INF/lib):

  • struts2-pdfstream-plugin-2.0.0.jar
  • jsoup-1.9.2.jar
  • openhtmltopdf-core-0.0.1-RC4.jar
  • openhtmltopdf-pdfbox-0.0.1-RC4.jar
  • pdfbox-2.0.0.jar
  • fontbox-2.0.0.jar

If you are using Maven, add this to your project POM:

<dependencies>
    ...
    <dependency>
        <groupId>com.amashchenko.struts2.pdfstream</groupId>
        <artifactId>struts2-pdfstream-plugin</artifactId>
        <version>2.0.0</version>
    </dependency>
    ...
</dependencies>

If you intend to transform Apache Tiles definition additional jar must be included.

For the Apache Tiles support add the struts2-pdfstream-tiles.

<dependency>
    <groupId>com.amashchenko.struts2.pdfstream</groupId>
    <artifactId>struts2-pdfstream-tiles</artifactId>
    <version>2.0.0</version>
</dependency>

Usage

  1. Install this plugin by adding dependency to your POM or by copying jars into /WEB-INF/lib directory.
  2. Make your action package extend pdfstream-default package or add pdfstream result type.
  3. Use pdfstream result type.

Examples

JSP to PDF stream

<action name="jspToPdf">
    <result type="pdfstream">
        <param name="location">/WEB-INF/pages/example.jsp</param>
        <param name="cssPaths">css/bootstrap.min.css, css/style.css</param>
        <param name="contentDisposition">attachment;filename=jsppdf.pdf</param>
    </result>
</action>

HTML to PDF stream

<action name="htmlToPdf">
    <result type="pdfstream">
        <param name="location">/WEB-INF/pages/example.html</param>
        <param name="cssPaths">css/bootstrap.min.css, css/style.css</param>
        <param name="contentDisposition">attachment;filename=htmlpdf.pdf</param>
    </result>
</action>

Tiles definition to PDF stream

<action name="tilesToPdf">
    <result type="pdfstream">
        <param name="location">example</param>
        <param name="renderer">tiles</param>
        <param name="contentDisposition">attachment;filename=tilespdf.pdf</param>
    </result>
</action>

FreeMarker template to PDF stream

<action name="freemarkerToPdf">
    <result type="pdfstream">
        <param name="location">/WEB-INF/ftl/example.ftl</param>
        <param name="renderer">freemarker</param>
        <param name="cssPaths">css/bootstrap.min.css, css/style.css</param>
        <param name="contentDisposition">attachment;filename=ftlpdf.pdf</param>
    </result>
</action>

Extending the plugin

Adding support for other views

This plugin can be easily extended in order to add support for transforming other views (e.g. Velocity) into PDF.

  1. Implement com.amashchenko.struts2.pdfstream.ViewRenderer interface.

  2. Create bean definition in struts.xml or in struts-plugin.xml with type="com.amashchenko.struts2.pdfstream.ViewRenderer" and custom name.

     <bean type="com.amashchenko.struts2.pdfstream.ViewRenderer" 
           class="some.package.CustomRenderer" name="customrenderer" />
    
  3. Use pdfstream result with the renderer parameter set to the name of the bean you have defined.

     <action name="customToPdf">
         <result type="pdfstream">
             <param name="location">example</param>
             <param name="renderer">customrenderer</param>
         </result>
     </action>