ParseException:遇到" /" list.xml的列表类型

时间:2015-08-26 11:05:06

标签: java freemarker odt parseexception

我试图从包含列表字段的现有ODT模板生成PDF。

我的ODT模板如下所示。 enter image description here

我有一个方法来获取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。有没有办法在这里找出问题?

1 个答案:

答案 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的格式样式。 在可视化编辑器中无法看到这种情况。 因此,最好的策略可能是编写文档而不进行格式化,添加字段,然后应用格式。

来自意大利的问候