我试图从包含列表字段的现有ODT模板生成PDF。
我有一个方法来获取ByteArrayOutputStream对象以进行进一步处理。
public ByteArrayOutputStream execute(Map<String, Object> data, byte[] templateData) {
ByteArrayOutputStream odt = new ByteArrayOutputStream();
try {
DocumentTemplateFactory documentTemplateFactory = new DocumentTemplateFactory();
DocumentTemplate template = documentTemplateFactory.getTemplate(new ByteArrayInputStream(templateData));
template.createDocument(data, odt);
return odt;
} catch (Throwable e) {
}
}
此处参数templateData
是ODT模板文件的字节数组,参数data
包含由
row
MyRow row = new MyRow();
row.setCol1("1");
row.setCol2("2");
row.setCol3("3");
row.setCol4("4");
List<MyRow> rows = new ArrayList<MyRow>();
rows.add(row);
data.put("row",rows);
当流程达到上述createDocument
方法时,会导致以下异常。
freemarker.core.ParseException: Encountered "/" at line 4, column 13223 in content.xml.
Was expecting one of:
<STRING_LITERAL> ...
<RAW_STRING> ...
"false" ...
"true" ...
<INTEGER> ...
<DECIMAL> ...
"." ...
"+" ...
"-" ...
"!" ...
"[" ...
"(" ...
"{" ...
<ID> ...
at freemarker.core.FMParser.generateParseException(FMParser.java:4697)
at freemarker.core.FMParser.jj_consume_token(FMParser.java:4568)
at freemarker.core.FMParser.UnaryExpression(FMParser.java:323)
at freemarker.core.FMParser.MultiplicativeExpression(FMParser.java:435)
at freemarker.core.FMParser.AdditiveExpression(FMParser.java:385)
at freemarker.core.FMParser.RangeExpression(FMParser.java:556)
at freemarker.core.FMParser.RelationalExpression(FMParser.java:538)
at freemarker.core.FMParser.EqualityExpression(FMParser.java:476)
...
我无法以字节数组格式查看content.xml。有没有办法在这里找出问题?
答案 0 :(得分:1)
这里是解决方案:
1)从odt文档中提取文件content.xml(只需将zip扩展名添加到文件名中) 2)使用文本编辑器打开xml文件 4)搜索您在模板中指定的所有字段名称
例如,如果您使用标准的FreeMarker表达式表示法并且已将字段$ {MYPLACEHOLDER}添加到模板中,则可以看到一些xml代码,如下所示:
...<text:span text:style-name="T4">${MYPLACEHOLDER}</text:span>...
但有时候,你报告的情况就是这样,你可以找到以下xml代码:
...<text:span text:style-name="T4">${</text:span></text:span><text:span text:style-name="Character_20_Style_20_1"><text:span text:style-name="T5">MYPLACEHOLDER</text:span></text:span>...
您的自定义字段语法被拆分(请参阅美元字符)。
原因是什么?
有时,用户可能会以错误的方式使用OpenOffice或LibreOffice格式化文档,从而分割字段palceholder的格式样式。 在可视化编辑器中无法看到这种情况。 因此,最好的策略可能是编写文档而不进行格式化,添加字段,然后应用格式。
来自意大利的问候