3

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

我的 ODT 模板如下所示。 在此处输入图像描述

而且我有一种方法可以获取 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,因为它是字节数组格式。有没有办法在这里识别问题?

4

1 回答 1

2

这里的解决方案:

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 格式化文档,从而拆分字段占位符的格式样式。这种情况在可视化编辑器中是不可见的。所以最好的策略可能是编写一个不格式化的文档,添加字段,然后应用格式化。

来自意大利的问候

于 2017-04-27T11:35:34.067 回答