Я пытался создать PDF-файл из существующего шаблона ODT с полями списка.ParseException: Encounted "/" content.xml для типа списка
Мой шаблон 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)
...
Я не могу просмотреть содержимое.xml, как в формате массива байтов. Есть ли способ идентифицировать проблему здесь?
Если у вас есть контроль над методом 'execute' в вашем фрагменте кода, то попробуйте сначала сохранить содержимое массива байтов во временный файл и посмотреть внутри. – SubOptimal
@SubOptimal Что-то вроде этого ??? 'FileOutputStream output = new FileOutputStream ( \t \t \t \t \t новый файл (" Template.odt ")); \t \t \t IOUtils.write (шаблонData, output); ' –
Да. Что-то вроде этого. Затем загляните внутрь 'Template.odt'. Это на самом деле ZIP-файл (предполагается, что templateData является файлом ODT). Посмотрите в 'content.xml' в положение сбоя. Возможно, это уже показывает, что не так, или, по крайней мере, укажет направление дальнейшего расследования. – SubOptimal