Spring,Java:填写表单并转换为PDF

时间:2016-11-04 10:19:00

标签: java forms pdf

我正在开发一个Spring-MVC项目,我们有用户注册我们。现在,每当用户注册时,我们都希望填写用户的姓名,地址等信息,同时保持用户的某些部分不变,例如我们的姓名,地址等。一旦填写完毕,转换后将其转换为PDF并将其附加到电子邮件中。我有一个doc,pdf,html格式。我已经有了将文件附加到电子邮件中的代码。

这个问题的最佳策略是什么?谢谢。

2 个答案:

答案 0 :(得分:2)

最佳解决方案是将表单作为PDF格式(AcroForm技术)提供。然后,您可以使用PDF库使用从HTML表单中检索的数据填写该表单。

例如参见:How to fill out a pdf file programatically?

PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
AcroFields form = stamper.getAcroFields();
form.setField(key, value);
stamper.setFormFlattening(true);
stamper.close();
reader.close();

如果您删除该行stamper.setFormFlattening(true);,该表单仍将是交互式的。通过添加该行,您可以删除所有表单域(以及交互性)。

您甚至可以要求人们填写PDF表单,如下所示:Edit pdf embedded in the browser and save the pdf directly to server

我认为Spring附带了(强大的旧版本)iText。您可能想要使用最新版本。有关iText 5和iText 7之间差异的更多信息,请访问官方网站。

答案 1 :(得分:1)

您可以使用java的JasperReport实用程序。您需要做的是创建一个标准的Jasper模板(.jasper扩展文件),您可以在其中配置所需的字段,并使用java代码填充该报表运行时,同时保持固定状态,如您的姓名,不需要的地址在获得用户请求对象时感受每个用户请求。

Jasper可以在后端填充此模板,它允许您生成pdf运行时,您可以在电子邮件响应中附加所需的PDF格式。

首先,输入JSON:

{ 
    "userName": "Evil Raat",
    "details": {
        "email": "not_really@test.com"
    }
}

然后在iReport Designer中创建一个JSON DataSource并将其指向您的文件(将所有其他详细信息保留为默认值)

接下来,您可以使用以下jrxml模板将上述JSON呈现为报告:

<?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="sample" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a894078a-929b-4aae-a1d0-46485f0f8835">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString language="json">
        <![CDATA[]]>
    </queryString>
    <field name="userName" class="java.lang.String">
        <fieldDescription><![CDATA[userName]]></fieldDescription>
    </field>
    <field name="userEmail" class="java.lang.String">
        <fieldDescription><![CDATA[details.email]]></fieldDescription>
    </field>
    <title>
        <band height="200" splitType="Stretch">
            <textField>
                <reportElement uuid="3b74775b-4555-43c3-bdf2-1677145c8660" x="0" y="31" width="555" height="20"/>
                <textElement textAlignment="Right">
                    <font fontName="Helvetica" size="12" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{userName}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="aa6cc7c8-2ca1-4f0f-92e2-c466083daba0" x="0" y="54" width="555" height="20"/>
                <textElement textAlignment="Right">
                    <font fontName="Helvetica" size="12" isBold="true"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{userEmail}]]></textFieldExpression>
            </textField>
        </band>
    </title>
</jasperReport>

比你可以创建像

这样的代码
Resource resource = new ClassPathXmlApplicationContext().getResource("classpath:reports/project.jrxml");
JsonDataSource ds = new JsonDataSource(new File("c:\myjson.json"));
jasperDesign = JRXmlLoader.load(resource.getInputStream());
JasperReport jasperReport  = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,  parameters,  ds);
JasperExportManager.exportReportToPdfFile(jasperPrint, destination+fileName+".pdf");

在上面的代码中,我使用.json文件作为填充报告的数据源。您可以运行时生成json并在填写报告时提供它。