如何使用带有itext的pdf模板导出数据集?

时间:2017-06-26 06:49:12

标签: java pdf itext acrofields

在我的项目中,需要以PDF格式导出一些数据集。

我了解到iText很有用,而且PdfpTable可以完成这项工作,但它需要很多代码来处理样式。虽然使用PDF模板可以节省时间和代码来调整样式,但我只能在模板中设置某些字段。

您能否给我一些使用foreach等命令显示数据集的建议?提前谢谢!

以下是使用pdfpTable的代码,它完成了这项工作,但代码有点难看:

 PdfPTable pdfTable = createNewPDFTable();    
   for (int i = 0; i < dataSet.size(); i++) {
                MetaObject metaObject = SystemMetaObject.forObject(dataSet.get(i));
                for (String field : fields) {
                    Phrase phrase = new Phrase(String.valueOf(metaObject.getValue(field) != null ? metaObject.getValue(field) : "")
                            , PDFUtil.createChineseSong(DEFAULT_CELL_FONT_SIZE));
                    PdfPCell fieldCell = new PdfPCell(phrase);
                    fieldCell.setBorder(Rectangle.NO_BORDER);
                    fieldCell.setFixedHeight(DEFAULT_COLUMN_HEIGHT);
                    fieldCell.setHorizontalAlignment(Element.ALIGN_CENTER);
                    fieldCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                    pdfTable.addCell(fieldCell);
                }
            }

以下是使用pdfp模板的一些代码,这些代码是从itext示例中复制而来的,工作尚未完成,因为我还没有找到合适的方式来显示数据集。

PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();
        form.setField("text_1", "Bruno Lowagie");
        form.setFieldProperty("text_1", "setfflags", PdfFormField.FF_READ_ONLY, null);

1 个答案:

答案 0 :(得分:1)

您的问题存在不一致之处。您写道:PdfpTable可以完成工作,但需要很多代码来处理样式。但是,在您的第一个代码段中,您并不像人们期望的那样真正创建PDF。您可以创建使用PdfPTable来创建模板,而不是生成大量已完成的PDF。我假设您然后使用该模板创建大量已完成的PDF。

如果您想使用模板并在之后填充,则不应使用iText创建表单。手动创建它,例如使用Open Office或Libre Office。例如,参见本书chapter 6中的示例(第6.3.5节)。使用具有GUI的工具创建模板,然后使用iText多次填写该模板。

这种方法有一些缺点:所有内容都必须适合您定义的字段。所有字段在固定页面上都有固定位置。

如果&#34;通过代码应用样式&#34;是一个问题,您可能想要遵循ZUGFeRD书中描述的方法。在该书中,我们首先创建HTML:Creating HTML invoices

获得HTML后,将HTML转换为PDF,并使用CSS应用样式:Creating PDF invoices

这是我们创建ZUGFeRDDocument

的方式
ZugferdDocument pdfDocument = new ZugferdDocument(
    new PdfWriter(fos), ZugferdConformanceLevel.ZUGFeRDComfort,
    new PdfOutputIntent("Custom", "", "http://www.color.org",
        "sRGB IEC61966-2.1", new FileInputStream(INTENT)));
pdfDocument.addFileAttachment(
    "ZUGFeRD invoice", dom.toXML(), "ZUGFeRD-invoice.xml",
    PdfName.ApplicationXml, new PdfDictionary(), PdfName.Alternative);
pdfDocument.setTagged();

HtmlConverter.convertToPdf(
    new ByteArrayInputStream(html), pdfDocument, getProperties());

getProperties()方法如下所示:

public ConverterProperties getProperties() {
    if (properties == null) {
        properties = new ConverterProperties()
            .setBaseUri("resources/zugferd/");
    }
    return properties;
}

您可以在此处找到有关如何使用HTML到PDF的其他示例:pdfHTML add-on(请阅读introduction)。

请注意,您使用的是旧版iText。我分享的例子是使用iText 7. iText 5和iText 7之间存在巨大差异。