使用JasperReports将html内容导出为pdf

时间:2009-07-07 11:16:37

标签: html jasper-reports export-to-pdf

如何使用JasperReports将HTML内容导出为PDF,我有一个带有HTML类型值的参数,我必须将其导出为pdf文件,其中pdf必须解析html含量

1 个答案:

答案 0 :(得分:6)

为了在报告中显示 html 代码,我们可以使用Jaspersoft开发的 htmlcomponent (正如我在查看源代码后所做的那样,作者是Narcis Marcu)。

此组件有很多限制,无论如何都无法为任何复杂的html页面提供帮助。无论如何,下面解释了如何使用这个组件。

借助 iReport 5.6.0 ,可以轻松地将此组件添加到报告中。在 Jaspersoft Studio JSS )的最新版本中,由于某些原因,该组件已从调色板中删除。

iReport 中的 Html 组件:

Html component in iReport

使用JSS

如果您使用的是 JSS ,则没有理由感到不安 - Html 组件的支持仍然存在于 Studio 中。您可以在以下文件夹中找到 htmlcomponent.jar Jaspersoft Studio-6.3.1.final\configuration\org.eclipse.osgi\38\0\.cp\lib\

我们可以使用 JSS 中的 Generic 组件来使用 Html 组件的所有功能。

How to add Generic component in JSS

为此,我们应该至少设置 Generic 组件的几个属性:

Properties of Generic component

通用类型名称应为: htmlelement
通用类型命名空间应为: http://jasperreports.sourceforge.net/jasperreports/html

我们可以使用 Html 组件的这些属性进行操作:

  • scaleType - 图像显示类型。支持以下值之一: Clip,FillFrame,RetainShape,RealHeight,RealSize
  • horizo​​ntalAlign - 水平图像对齐。支持以下值之一:左,中,右
  • verticalAlign - 垂直图像对齐。支持以下值之一:顶部,中部,底部
  • clipOnOverflow
  • evaluationTime
  • evaluationGroup

JSS 可以借助组件属性的高级选项卡设置此属性:

Setting properties in JSS

iReport ,设置相同的属性要容易得多:

Setting properties in iReport

正如我之前提到的, JSS 仍然支持 htmlcomponent 。如果 jrxml 文件包含 htmlcomponent ,则可以使用与 iReport 相同的方式查看 JSS 中的所有属性。

Setting properties in JSS for template with htmlcomponent

使用htmlcomponent组件

的示例

我们可以在 JRPdfExporter 的帮助下,在 pdf 报告中显示这个简单的 html 页面。

html 页面:

<!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>

我们将尝试在 HTML组件包装(本机组件)的帮助下使用 htmlcomponent 并借助 Generic < / em>组件。

html 代码将通过报告的参数传递(样本中为htmlCode

使用原生 htmlcomponent 组件。

jrxml 文件:

<?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>

使用通用组件。

jrxml 文件:

<?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>

在这两种情况下,我们都可以使用相同的 Java 代码:

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());

对于有效的工作(报告编译),我们应该将 htmlcomponent.jar 添加到类路径中!

输出结果

两种情况的输出结果都是相同的:

The pdf file generated with JRPdfExporter

更多信息: