2017-06-26 68 views
0

在我的项目中,需要以PDF格式导出一些数据集。如何导出使用pdf模板和itext的数据集?

我了解到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

您的问题存在不一致。你写:PdfpTable可以做这项工作,但它需要很多代码来处理样式。但是,在您的第一个代码片段中,您并不是按照预期的方式创建PDF文件。您可以使用PdfPTable创建模板,而不是生成大量完成的PDF。我假设你然后使用该模板创建大量完成的PDF。

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

这种方法有一些不足之处:所有内容必须符合您定义的字段。所有字段在固定页面上都有固定的位置。

如果“通过代码应用样式”是一个问题,您可能需要遵循ZUGFRD数据手册中描述的方法。在这本书中,我们首先创建了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有很大的区别。

+0

感谢您的回复。也许我没有清楚地描述这个问题,PdfpTalbe的第一个片段是我目前使用的,它已经完成了整个工作,并且我想用PDF模板来替换第一种方式,但由于我没有完成工作,所以工作还没有完成没有找到适当的方式来显示数据集。使用HTML是一个很好的建议,我会试一试。 –

+0

我不明白(而且我还是不明白)为什么你在'PdfPTable'中使用表单域。我只是使用'PdfPTable'并用数据填充(不包含表单域)。 –

+0

我不使用PdfpTalbe中的表单域,我只想使用PDF模板和表单文件来替换PdfpTale。 –

相关问题