2015-08-26 6 views
2

Я пытался создать PDF-файл из существующего шаблона ODT с полями списка.ParseException: Encounted "/" content.xml для типа списка

Мой шаблон 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) 
... 

Я не могу просмотреть содержимое.xml, как в формате массива байтов. Есть ли способ идентифицировать проблему здесь?

+0

Если у вас есть контроль над методом 'execute' в вашем фрагменте кода, то попробуйте сначала сохранить содержимое массива байтов во временный файл и посмотреть внутри. – SubOptimal

+0

@SubOptimal Что-то вроде этого ??? 'FileOutputStream output = new FileOutputStream ( \t \t \t \t \t новый файл (" Template.odt ")); \t \t \t IOUtils.write (шаблонData, output); ' –

+0

Да. Что-то вроде этого. Затем загляните внутрь 'Template.odt'. Это на самом деле ZIP-файл (предполагается, что templateData является файлом ODT). Посмотрите в 'content.xml' в положение сбоя. Возможно, это уже показывает, что не так, или, по крайней мере, укажет направление дальнейшего расследования. – SubOptimal

ответ

0

Здесь решение:

1) Извлеките файл content.xml из вашего ODT документа (просто добавьте расширение зип к имени файла) 2) Откройте файл с помощью текстового редактора 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 не по-другому, разделяя стили форматирования поля. Эта ситуация не может быть видна внутри визуального редактора. Таким образом, лучшей стратегией может быть запись документа без его форматирования, добавление полей и последующее применение форматирования.

Привет из Италии