html - 使用JasperReports将html内容导出为pdf

标签 html jasper-reports export-to-pdf

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

最佳答案

为了在报告中显示html代码,我们可以使用Jaspersoft开发的htmlcomponent(我在看了源代码后才发现作者是Narcis Marcu)。
该组件有很多局限性,在任何情况下都无法为您提供任何复杂程度的html页面。无论如何,以下内容说明了如何使用此组件。
借助iReport 5.6.0,可以轻松地将此组件添加到报表中。在Jaspersoft Studio(JSS)的最新版本中,由于某些原因将该组件从面板中删除。
iReport中的HTML组件:
Html component in iReport
使用JSS
如果您使用的是JSS,则无需担心-Studio中仍然存在对Html组件的支持。您可以在以下文件夹中找到htmlcomponent.jar:Jaspersoft Studio-6.3.1.final\configuration\org.eclipse.osgi\38\0\.cp\lib\
我们可以在JSS中使用通用组件来使用Html组件的所有功能。
How to add Generic component in JSS
为此,我们应该至少设置通用组件的几个属性:
Properties of Generic component
通用类型名称应为: htmlelement
通用类型命名空间应为: http://jasperreports.sourceforge.net/jasperreports/html
我们可以使用HTML组件的以下属性进行操作:

  • scaleType -图像显示类型。支持以下值之一:Clip,FillFrame,RetainShape,RealHeight,RealSize
  • horizo​​ntalAlign -水平图像对齐。支持以下值之一:Left,Center,Right
  • verticalAlign -垂直图像对齐。支持以下值之一:上,中,下
  • clipOn溢出
  • 评估时间
  • 评估组

  • 可以使用组件属性的“高级”选项卡来设置此属性的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组件的包装器( native 组件)的帮助下以及Generic组件的帮助下使用htmlcomponent。
    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

    更多信息:
  • 有关使用通用元素的信息-JasperReports - Generic Element Sample
  • Petter Friberg的不错回答:How to export HTML text with embedded images (base64, data uri) using the htmlcomponent?
  • 可以在JasperReports库包的jasperreports-6.x\demo\samples\htmlcomponent文件夹
  • 中找到htmlcomponent组件的源代码和使用示例。
  • 可以在JasperReports库包的另一个文件夹中找到另一个示例-jasperreports-6.x\demo\samples\genericelement
  • 关于html - 使用JasperReports将html内容导出为pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1091760/

    相关文章:

    html - 垂直居中 Bootstrap 按钮

    java - 尝试使用 Java 打印 JasperReports 报告时,Tomcat Apache 服务器在尝试再次查看报告时关闭

    java - 如何使用 jasper 报告在 java beans 中生成包含 3 个嵌套列表的表?

    javascript - DataTable,导出为 pdf 不能正常使用两个标题和 colspan

    html - css 左右简单菜单

    javascript - 使用类时 jQuery Popup Overlay 不显示

    jasper-reports - Jasper中表名的动态参数

    jasper-reports - 如何从 Jaspersoft/JRXML 生成双语标记 PDF 输出?

    fonts - Jasper iReport 在 Chrome 中生成的 PDF 中的问题

    javascript - 如何将图像添加到 JQuery 对话框