Создайте новый абзац с помощью Docx4j

У меня проблема с созданием абзаца с помощью docx4j. На самом деле не сам абзац, а его содержание. Я собираю новый документ из абзацев (фактически «блоков» из абзацев), и все работает нормально. Я добавляю их в список, и когда есть все необходимые абзацы, я собираю документ. Теперь между этими блоками мне нужны новые абзацы с добавленным произвольным текстом. Я использую эту функцию для создания абзаца:

private P createParagraph(String content) {

P result = factory.createP();
R run = factory.createR();
Text text = factory.createText();

text.setValue(content);
run.getContent().add(text);
result.getContent().add(run);

System.out.println("HEADER : " + result.toString());

return result;
}

Печать выводит только «ЗАГОЛОВОК:», а result.toString () - это пустая строка. Это почему?

БОНУСНЫЙ вопрос: Я не хотел открывать для этого новую ветку. Можно ли добавить идентификатор абзаца, который появится в сгенерированном html? (например, p id = "xyz" ...>

Большое тебе спасибо!


person omniflash    schedule 05.09.2013    source источник
comment
По поводу вашего вопроса об идентификаторе см. Мой ответ на странице stackoverflow.com/questions/18255776/ Если у вас есть дополнительный вопрос по идентификаторам абзацев, опубликуйте его как отдельный вопрос.   -  person JasonPlutext    schedule 06.09.2013


Ответы (1)


Если вы хотите увидеть XML, которым станет ваш объект P, используйте:

    System.out.println(
            XmlUtils.marshaltoString(result, true, true) );

org.docx4j.wml.P - это класс, созданный xjc JAXB.

Есть несколько плагинов, перечисленных на https://java.net/projects/jaxb2-commons/pages/Home, который мы могли бы использовать для создания метода toString, но не сделали этого.

Если вам нужно текстовое содержимое абзаца, вы можете использовать TextUtils

person JasonPlutext    schedule 05.09.2013
comment
Спасибо. Теперь я создал пустой документ, содержащий только нужный мне текст в абзаце. Используя упомянутый вами метод, я проверил структуру. Я добавил все недостающие теги, и теперь он выглядит точно так же, как мой документ, просматриваемый в веб-приложении docx4j. Единственная разница - это множество определений пространств имен в моем ‹w: p› начальном элементе: ‹w: p xmlns: w15 = schemas.microsoft.com/office/word/2012/wordml xmlns: w14 = ... Но если я вызываю toString, текст все равно отсутствует. : / - person omniflash; 05.09.2013
comment
Я обновил свой ответ. Что касается пространств имен, они обычно объявляются один раз в верхней части части (в отличие от каждого абзаца). Об этом позаботится JAXB. Однако реализация Sun / Oracle не удаляет лишние. - person JasonPlutext; 06.09.2013