26 ноября 2010 г.

Создание документа ODF с помощью ODFDOM Simple Java API

Документ ODF, как известно, представляет из себя ZIP-архив, который содержит xml-файлы и различные ресурсы документа, например картинки. Наиболее значимые xml-файлы это content.xml, который содержит по сути весь текст документа и его структуру, и styles.xml, который хранит стили документа.

Элементы файла content.xml, содержащие текст, могут использовать стили, описанные в файле styles.xml, обращаясь к ним по имени. Проще говоря, в элементе файла content.xml указывается имя стиля из styles.xml, которое должно применяться для текста, параграфа и т.п. Стили так же представляют из себя набор XML-элементов.

Изучать стрктуру и все элементы ODF дело скучное да и мало кому, я думаю, нужное. Для того, чтобы работать с форматом ODF на высоком уровне существует библиотека ODFDOM. На самом деле эта библиотека не такая уж и простая, и чтобы ею пользоваться нужно все же понимать устройство ODF и уметь работать с XML при помощи Apache Xerces-J. Но для действительно простой работы с ODF теперь есть надстройка над ODFDOM, которая называется Simple Java API for ODF. Раньше я писал о том, как можно работать с документами ODF из Java-программы используя OpenOffice. Использование библиотеки ODFDOM Simple Java API намного удобнее как с точки зрения написания кода, так и тем, что вам теперь не нужен установленный OpenOffice. Благодаря этой библиотеке вы сами легко можете создавать программы работающие с ODF.

Для того чтобы ей воспользоваться на момент написания статьи нужны следующие штуковины:
Из Apache Xerces необходимо два файла xercesImpl.jar и xml-apis.jar. Все библиотеки подключаем как User Libraries в свою IDE (в моем случае это Eclipse), либо пихаем в <Путь к JDK>/jre/lib/ext, либо указываем в CLASSPATH, это уж кто как привык или кто как считает правильным.


Пример простой программы с комментариями, демонстрирующий создание документа ODF и использование стилей оформления текста:
import org.odftoolkit.odfdom.dom.attribute.fo.*;
import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineStyleAttribute;
import org.odftoolkit.odfdom.dom.attribute.style.StyleTextUnderlineTypeAttribute;
import org.odftoolkit.odfdom.dom.style.*;
import org.odftoolkit.odfdom.dom.style.props.*;
import org.odftoolkit.odfdom.incubator.doc.office.*;
import org.odftoolkit.odfdom.incubator.doc.style.*;
import org.odftoolkit.odfdom.incubator.doc.text.*;
import org.odftoolkit.simple.*;

public class TestOdfSimple {

 public static void main(String[] args) throws Exception {
  
  // Создаем новый текстовый документ
  TextDocument textDoc = TextDocument.newTextDocument();  
  
  // Добавляем текст в конец последнего параграфа документа.
  // Если параграфа нет, то он будет создан.
  textDoc.addText("Просто текст");
  
  // Создаем стили
  createTextStyles(textDoc);
  
  // Создаем параграф
  OdfTextParagraph p1 = textDoc.newParagraph();
  
  // Настраиваем стиль параграфа по умолчанию
  // Размер шрифта
  p1.setProperty(OdfTextProperties.FontSize, "10pt");
  // Стиль шрифта - курсив
  p1.setProperty(OdfTextProperties.FontStyle,
    FoFontStyleAttribute.Value.ITALIC.toString());
  // Обрамление параграфа. Указываем ширину полосы, стиль (сплошная) и цвет
  p1.setProperty(OdfParagraphProperties.Border, "2pt solid #382EFF");
  // Выравнивание текста по ширине
  p1.setProperty(OdfParagraphProperties.TextAlign,
    FoTextAlignAttribute.Value.JUSTIFY.toString());
  
  // Добавляем текст, который использует стиль параграфа по умолчанию
  p1.addContentWhitespace("Текст использующий стиль параграфа\n");
  // Пустая строка
  p1.addContentWhitespace("\n");
  // Добавляем куски текста применяя подготовленные стили
  p1.addStyledSpanWhitespace("style1", "Текст со стилем style1\n");
  p1.addStyledSpanWhitespace("style2", "Текст со стилем style2");
  p1.addStyledSpanWhitespace("style1", "Еще немного текста со стилем style1");
  
  
  // Сохраняем документ
  textDoc.save("test.odt");
 }

 /**
  * Создает стили для текста документа.
  * 
  * @param textDoc
  */
 private static void createTextStyles(TextDocument textDoc) {
  
  // Получаем стили документа (или создаем, если они отсутствуют)
  OdfOfficeStyles stylesOfficeStyles = textDoc.getOrCreateDocumentStyles();
  
  // Ссылка на объект, который будем
  // использовать для создания стилей
  OdfStyle style; 
  
  // Создаем стиль с именем style1
  style = stylesOfficeStyles.newStyle("style1",OdfStyleFamily.Text);
  // Размер шрифта
  style.setProperty(OdfTextProperties.FontSize, "14pt");
  // Шрифт полужирный
  style.setProperty(OdfTextProperties.FontWeight, "bold");
  // Цвет шрифта
  style.setProperty(OdfTextProperties.Color, "#FF0A0A");
  // Название шрифта
  style.setProperty(OdfTextProperties.FontFamily, "Arial Black");
  
  
  // Стиль style2
  style = stylesOfficeStyles.newStyle("style2",OdfStyleFamily.Text);
  style.setProperty(OdfTextProperties.FontSize, "18pt");
  // Цвет фона
  style.setProperty(OdfTextProperties.BackgroundColor, "#0CFF0C");
  // Цвет подчеркивающей линии
  style.setProperty(OdfTextProperties.TextUnderlineColor, "#FFEF56");
  // Тип подчеркивающей линии - двойная
  style.setProperty(OdfTextProperties.TextUnderlineType,
    StyleTextUnderlineTypeAttribute.Value.DOUBLE.toString());
  // Стиль подчеркивающей линии - волнистая
  style.setProperty(OdfTextProperties.TextUnderlineStyle,
    StyleTextUnderlineStyleAttribute.Value.WAVE.toString());
  // Весь текст будет отображаться в верхнем регистре
  style.setProperty(OdfTextProperties.TextTransform,
    FoTextTransformAttribute.Value.UPPERCASE.toString());
 }
}

В результате выполнения этой программы получаем вот такой гениальный и потрясающий своей красотой текст:
 
Хорошие, простые и более полезные примеры по работе с текстом (поиск, вырезание, замена и т.п.), таблицами и презентациями можно поглядеть тут и тут.

Комментариев нет:

Отправить комментарий