在我的项目中,需要以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);
您的问题存在不一致之处。您编写:PdfpTable
可以完成工作,但是它需要很多代码来处理样式。但是,在您的第一个代码段中,您并没有像人们期望的那样创建PDF。您可以创建使用PdfPTable
来创建模板,而不是产生大量的成品PDF。我假设您然后使用该模板创建大量的成品PDF。
如果您想使用模板并将其填充,则不应使用itext创建表单。手动创建它,例如使用开放式办公室或Libre办公室。例如,请参见我书的第6章中的示例(第6.3.5节(。使用具有GUI的工具创建模板,然后使用ITEXT多次填写该模板。
这种方法具有一些偏低:所有内容都必须适合您定义的字段。所有字段在固定页面上均具有固定位置。
如果"通过代码应用样式"是一个问题,则可能需要遵循Zugferd书中描述的方法。在那本书中,我们首先创建HTML:创建HTML发票。
拥有HTML后,然后将HTML转换为PDF,然后使用CSS应用样式:创建PDF发票。
这就是我们创建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附加组件(阅读简介(。
请注意,您正在使用旧版本的Itext。我共享的示例使用了Itext7。Itext5和Itext 7之间存在巨大差异。