Noveo

Наш блог Java-шаблонизация для *.docx и *.pptx-файлов

Java-шаблонизация для *.docx и *.pptx-файлов

Некоторое время назад в одном из проектов была интересная задача, связанная с сохранением данных, полученных из приложения, в DOCX и PPTX файлы. Наверняка практически каждый Java-программист знаком с такими библиотеками шаблонизации, как Freemarker и Apache Velocity. Нам нужно было что-то подобное, но для DOCX и PPTX файлов. При этом такой шаблонизатор должен был удовлетворять следующим требованиям:

  • вставка простых текстовых полей;
  • вставка дат;
  • вставка изображений;
  • создание списков;
  • создание повторяющихся слайдов (для PPTX);
  • базовая HTML стилизация;
  • файл, который получается в результате, должен быть максимально чистым и удобным для редактирования пользователем.

Для DOCX файлов решение было найдено достаточно быстро. Библиотека XDocReport, несмотря на определенные неудобства при работе со сложными моделями и незначительные баги, неплохо справляется с задачей.

С PPTX файлами было намного сложнее. Подходящей библиотеки найти не удалось. XDocReport поддерживает PPTX, однако эта поддержка заключается всего лишь в возможности вставки простейших текстовых полей. Поэтому на основе перечисленных выше требований было разработано собственное решение.

Основные трудности, с которыми пришлось столкнуться при разработке, были связаны со сложной структурой PPTX файлов. DOCX и PPTX входят в серию форматов, которая называется Office Open XML (OOXML). Спецификация OOXML занимает больше 5000 страниц, и некоторые моменты в ней освещены недостаточно подробно.

В дальнейшем на основе наработок из этого проекта я создал библиотеку для шаблонизации PPTX презентаций.

На данный момент библиотека поддерживает следующие функции:

  • вставка обычных текстовых полей;
  • вставка дат с возможностью задания формата;
  • вставка полей с HTML синтаксисом;
  • вставка изображений;
  • создание списков;
  • заполнение таблиц.

В случае необходимости пользователь может легко расширить библиотеку и добавить собственные обработчики синтаксиса и внутренностей шаблона.

image

На рисунках на примере одного слайда из презентации показаны исходный шаблон и результат работы шаблонизатора.

В дальнейшем хотелось бы добавить в библиотеку следующие возможности:

  • создание повторяющихся слайдов;
  • улучшенная HTML стилизация;
  • поддержка DOCX и ODT форматов.

В ближайшее время планируется первый релиз библиотеки. Исходный код выложен на github: https://github.com/ayakovlevgh/jodtemplate.

Код с примером использования библиотеки:

// Создаем и заполняем модель (Model - пользовательский класс)
Model model = new Model();
model.setTitle("Lorem ipsum");
model.setDescription(new HtmlString(
   "<p><strong>Morbi lobortis mi vitae maximus.</strong></p>"
       + "<ol>"
       + "<li>Pellentesque cursus<ul>"
       + "<li><em>Etiam luctus</em></li>"
       + "<li><em>Proin et tellus</em></li>"
       + "</ul></li>"
       + "<li>Aliquam tempor<ul>"
       + "<li><em>Vivamus sit</em></li>"
       + "</ul></li>"
       + "<li>Pellentesque sed</li>"
       + "</ol>"));
model.setImage(new FileImageField(new File("image.jpg")));
// Создаем pptx документ, кладем модель в контекст
// и запускаем процесс шаблонизации.
PPTXDocument doc = new PPTXDocument();
Map<String, Object> context = new HashMap<>();
context.put("model", model);
try (
       InputStream template = new BufferedInputStream(
           new FileInputStream("template.pptx"));
       OutputStream result = new BufferedOutputStream(
           new FileOutputStream("result.pptx"))) {
   doc.process(context, template, result);

}

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

НазадПредыдущий пост ВпередСледующий пост

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: