Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Export html content to pdf using JasperReports

How do I export HTML content into PDF using JasperReports, I have a parameter which carries value of the type HTML, and I have to export the same to a pdf file, where the pdf has to parse the html content

like image 701
stanley Avatar asked Jul 07 '09 11:07

stanley


People also ask

How do I embed a PDF in Jasper?

Suggested approach. TIBCO JasperReports® library does not provide an option to embed an external PDF file into a report. The closest option available out of the box is to add a link to an external PDF file to your report.

How do I export a Jasper report?

Navigate to http://[localhost]:8480/jasperserver-pro/. Log into Standalone as sysadmin. Right-click the report you wish to export, then click Export.

Why do we use JasperReports?

JasperReports is an open-source reporting tool for Java that is used for reporting of applications. This reporting tool helps in writing rich content onto the screen, to the printer, or into a variety of files like HTML, PDF, XLS, RTF, CSV, XML, ODT and TXT.


1 Answers

For showing html code in report we can use htmlcomponent developed by Jaspersoft (as I understnd after looking at source code the author is Narcis Marcu).

This component has a lot of limitations and cannot assist you in every case for any html page of any complexity. Anyway, the below is explains how to use this component.

This component can be easily added to the report with help of iReport 5.6.0. At last versions of Jaspersoft Studio (JSS) this component was removed from the palette for some reasons.

The Html component in iReport:

Html component in iReport

Using JSS

If you are using the JSS there is no reason to be upset - the support of Html component is still present in Studio. You can find the htmlcomponent.jar in folder like this: Jaspersoft Studio-6.3.1.final\configuration\org.eclipse.osgi\38\0\.cp\lib\.

We can use Generic component in JSS for using all functionality of Html component.

How to add Generic component in JSS

For doing this we should set at least couple properties of Generic component:

Properties of Generic component

Generic Type Name should be: htmlelement
Generic Type Namespace should be: http://jasperreports.sourceforge.net/jasperreports/html

We can operate with this properties of Html component:

  • scaleType - Image displaying type. Supports one of this values: Clip, FillFrame, RetainShape, RealHeight, RealSize
  • horizontalAlign - Horizontal image alignment. Supports one of this values: Left, Center, Right
  • verticalAlign - Vertical image alignment. Supports one of this values: Top, Middle, Bottom
  • clipOnOverflow
  • evaluationTime
  • evaluationGroup

It JSS this properties can be set with help of Advanced tab of component's Properties:

Setting properties in JSS

At iReport its much easier to set the same properties:

Setting properties in iReport

As I mentioned before the JSS still has the htmlcomponent support. If you have jrxml file with htmlcomponent you can see all properties in JSS in the same way as at iReport.

Setting properties in JSS for template with htmlcomponent

Sample of using htmlcomponent component

We can show this simple html page at pdf report with help of JRPdfExporter.

The html page:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
    <title>Sample of html based report</title>
    <style type="text/css">
        body {
            padding-left: 11em;
            font-family: Georgia, "Times New Roman",
            Times, serif;
            color: purple;
            background-color: #a5d8da
        }

        h1 {
            font-family: Helvetica, Geneva, Arial,
            SunSans-Regular, sans-serif
        }
    </style>
</head>

<body>
<h1>This is a sample of html based report</h1>

<p>Only minimal html features are supported</p>

<p>At least images are supported</p>
<br/><br/>

<img src='file://C:\images\smile.png' alt='Smile' height='100' width='100'>
</body>
</html>

We will try to use htmlcomponent with help of wrapper (native component) for HTML component and with help of Generic component.

The html code will be passed via report's parameter (htmlCode in samples)

Using native htmlcomponent component.

The jrxml file:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Html component" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="htmlCode" class="java.lang.String"/>
    <title>
        <band height="742">
            <componentElement>
                <reportElement x="0" y="0" width="555" height="742"/>
                <hc:html xmlns:hc="http://jasperreports.sourceforge.net/htmlcomponent" xsi:schemaLocation="http://jasperreports.sourceforge.net/htmlcomponent http://jasperreports.sourceforge.net/xsd/htmlcomponent.xsd" scaleType="RetainShape" horizontalAlign="Left" verticalAlign="Top">
                    <hc:htmlContentExpression><![CDATA[$P{htmlCode}]]></hc:htmlContentExpression>
                </hc:html>
            </componentElement>
        </band>
    </title>
</jasperReport>

Using Generic component.

The jrxml file:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Generic builds html" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
    <parameter name="htmlCode" class="java.lang.String"/>
    <title>
        <band height="742">
            <genericElement>
                <reportElement x="0" y="0" width="555" height="742"/>
                <genericElementType namespace="http://jasperreports.sourceforge.net/jasperreports/html" name="htmlelement"/>
                <genericElementParameter name="htmlContent">
                    <valueExpression><![CDATA[$P{htmlCode}]]></valueExpression>
                </genericElementParameter>
                <genericElementParameter name="scaleType">
                    <valueExpression><![CDATA["RetainShape"]]></valueExpression>
                </genericElementParameter>
                <genericElementParameter name="verticalAlign">
                    <valueExpression><![CDATA["Top"]]></valueExpression>
                </genericElementParameter>
                <genericElementParameter name="horizontalAlign">
                    <valueExpression><![CDATA["Left"]]></valueExpression>
                </genericElementParameter>
            </genericElement>
        </band>
    </title>
</jasperReport>

In both cases we can use the same Java code:

Map<String, Object> params = new HashMap<>();
params.put("htmlCode", "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\">\n" +
        "<html>\n" +
        "<head>\n" +
        "    <title>Sample of html based report</title>\n" +
        "    <style type=\"text/css\">\n" +
        "        body {\n" +
        "            padding-left: 11em;\n" +
        "            font-family: Georgia, \"Times New Roman\",\n" +
        "            Times, serif;\n" +
        "            color: purple;\n" +
        "            background-color: #a5d8da\n" +
        "        }\n" +
        "\n" +
        "        h1 {\n" +
        "            font-family: Helvetica, Geneva, Arial,\n" +
        "            SunSans-Regular, sans-serif\n" +
        "        }\n" +
        "    </style>\n" +
        "</head>\n" +
        "\n" +
        "<body>\n" +
        "<h1>This is a sample of html based report</h1>\n" +
        "\n" +
        "<p>Only minimal html features are supported</p>\n" +
        "\n" +
        "<p>At least images are supported</p>\n" +
        "<br/><br/>\n" +
        "<img src='file:/C:\\images\\smile.png' alt='Smile' height='100' width='100'>\n" +
        "</body>\n" +
        "</html>");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, new JREmptyDataSource());

For valid working (report compiling) we should add htmlcomponent.jar to the classpath!

Output result

The output result for both cases will be the same:

The pdf file generated with JRPdfExporter


More info:

  • Information about using Generic Element - JasperReports - Generic Element Sample
  • Nice answer by Petter Friberg: How to export HTML text with embedded images (base64, data uri) using the htmlcomponent?
  • The source code of htmlcomponent component and the sample of using can be found in JasperReports library package at jasperreports-6.x\demo\samples\htmlcomponent folder
  • Another sample can be found at another folder of JasperReports library package - jasperreports-6.x\demo\samples\genericelement
like image 164
Alex K Avatar answered Oct 14 '22 21:10

Alex K