我有一个文档模板,其中某些字段是静态的,而其他字段是动态的。我需要替换一些数据(名称,姓氏,工资)并生成新文件。您建议使用哪个库来执行此操作? POI合适吗? 我正在使用Spring,Java EE6和Oracle。
答案 0 :(得分:3)
您可以尝试使用Apache POI,但操作word文件所需的POI的HWPF和XWPF部分使用起来非常复杂 - 您需要至少很好地理解word文件的结构!
使用iText和PDF的解决方案
我做了类似于PDF的事情(这可能是你的选择)
1)您可以使用LibreOffice在文档中创建字段(如在Acrobat Pro中)
2)现在您可以使用iText填写已创建的字段
以下是示例代码:
public byte[] getDocumentAsByteArray(Object dataBean, String pdfTemplateName) throws KkmsException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfStamper stamp = null;
InputStream templateInputStream = null;
Locale local = new Locale(language);
try {
templateInputStream = // get the file input stream of the pdf
PdfReader reader = new PdfReader(templateInputStream);
// Create a stamper that will copy the document to a new file
stamp = new PdfStamper(reader, outputStream);
AcroFields form = stamp.getAcroFields();
// form fields are normal text in the end
stamp.setFormFlattening(true);
Map<String, AcroFields.Item> map = (Map<String, AcroFields.Item>)form.getFields();
if (map != null) {
if (map.size() == 0) {
logger.debug("There are no fields in this PDF layout");
}
for (Entry<String, AcroFields.Item> e : map.entrySet()) {
logger.debug("PDF fieldname = " + e.getKey());
// at the moment we only handle text fields
if (AcroFields.FIELD_TYPE_TEXT == form.getFieldType(e.getKey())) {
fillForm(dataBean, form, e.getKey(), local);
} else {
logger.warn("Field type is not supported: "+form.getFieldType(e.getKey()));
}
}
}
stamp.close();
} catch (Exception e) {
logger.warn("Failed to create PDF document", e);
throw new KkmsException("Failed to create PDF document: "+e.getMessage());
} finally {
if (templateInputStream != null) {
try {
templateInputStream.close();
} catch (IOException e) {
throw new KkmsException("Failed to close InputStream of PDF document", e);
}
}
}
return outputStream.toByteArray();
}
最后你得到一个PDF - &gt;希望这对你至少有一点帮助!
另一种快速而肮脏的解决方案
可以使用odt或docx的强大功能 - &gt;将您的doc转换为docx或odt - &gt;它只是一个zip文件 - &gt;所以解压它 - &gt;你会在zip的根目录中看到一个content.xml文件 - &gt;那里有所有的文件内容 现在你可以在这里添加一些魔术标签(例如$$$),以后可以用你的程序替换
<text:p text:style-name="P3">SAP Customer Number:</text:p>
<text:p text:style-name="P3">SAP Customer Number: $$$sapCustomerNumber$$$</text:p>
现在创建一个解压缩odt / docx文件的程序 - &gt;替换标签 - &gt;再次压缩文件
答案 1 :(得分:2)
These slides,我在OSDC 2012上的演讲中,概述了一些主要方法。
这些天我可能会添加&#34;生成您想要的XHTML,然后将其导出到docx&#34;。由于我们引入了docx4j-ImportXHTML,支持将CSS @class值转换为Word样式,因此我们越来越多地看到这种方法。