Статьи

Интеграция Apache FOP с Eclipse и OSGi

Apache FOP – это процессор печати с открытым исходным кодом, управляемый объектами форматирования XSL ( XSL-FO ). Это может быть очень полезно, например, для преобразования объектов данных в PDF. Однако оказалось, что его сложно интегрировать в PDE и, наконец, запустить в качестве службы OSGi .

Из-за этого я предоставил репозиторий P2, который содержит необходимые пакеты в одной функции. Таким образом, установка цели PDE стала намного проще. В следующих разделах объясняется, как его использовать.

Apache FOP

Как указано в документации, Apache FOP ‘является Java-приложением, которое считывает дерево объекта форматирования (FO) и отображает полученные страницы в указанный вывод. В настоящее время поддерживаются следующие форматы вывода: PDF, PS, PCL, AFP, XML (представление дерева областей), печать, AWT и PNG и, в меньшей степени, RTF и TXT. Основной целью вывода является PDF ‘.

Конечно, есть возможность встроить процессор в программу Java. Основанный на JAXP , Apache FOP использует события SAX для получения входного документа XSL-FO. Фрагмент базового использования выглядит примерно так:

01
02
03
04
05
06
07
08
09
10
11
12
13
InputStream in = ... // the fo tree to process
  OutputStream out = ... // pdf destination
  FopFactory fopFactory = FopFactory.newInstance();
  try {
    Fop fop = fopFactory.newFop( MimeConstants.MIME_PDF, out );
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer();
    Source source = new StreamSource( in );
    Result result = new SAXResult( fop.getDefaultHandler() );
    transformer.transform( source, result );
  } finally {
    out.flush();
  }

Для подробного объяснения использования встроенного Apache FOP, пожалуйста, обратитесь к онлайн-документации .

Зависимость ада

Хотя фрагмент выглядит прямо, интеграция в Eclipse / OSGi была не такой простой. Может быть, я вел себя глупо, но мне потребовалось почти два дня, чтобы составить целевое определение, что в итоге и помогло.

Чтобы избежать этой проблемы в будущем и дать другим, кто может попасть в ту же ловушку, лучшее начало, я создал P2-репозиторий, упомянутый в начале. Чтобы использовать его, просто добавьте местоположение хранилища в качестве сайта программного обеспечения в определение цели Eclipse:

фат-целевая интеграция

Теперь определите зависимости пакета, который должен содержать процессор. Это зависимости org.apache.servicemix.bundles.fop и org.apache.servicemix.bundles.xmlgraphics-commons :

ФОП-зависимость

Как только они будут созданы, приведенный выше код компилируется. Легко разработать класс обслуживания, имеющий метод format для генерации PDF с подписью, как показано здесь:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public class FopService {
   
  private final FopFactory fopFactory;
 
  public FopService() {
    this.fopFactory = FopFactory.newInstance();
  }
   
  public void format(
    InputStream input, OutputStream output, InputStream stylesheet )
  {
    [...] // similar transformation code like above
  }
}

Я связал простой пример использования проекта, который предоставляет больше деталей. Проект содержит файл example.target, который уже интегрирует Apache FOP. После импорта проекта разрешите и установите его определение цели в рабочей области Eclipse. Запустите конфигурацию запуска «Пример FOP». И последнее, но не менее важное: откройте браузер и перейдите по URL-адресу http://localhost:10080/services/pdf .

Недавно созданный PDF должен быть готов к загрузке:

Загрузка PDF

Документы xml и xsl, используемые для создания PDF-файла, аналогичны документам, обработанным классом ExampleXML2PDF встраиваемых примеров Apache FOP. В PDF-файле содержится простой список членов команды разработчиков.

в результате, PDF

Имейте в виду, что «Apache FOP в настоящее время не может быть полностью поточно-ориентированным» (см. Раздел «Многопоточность FOP»
Apache FOP: Встраивание ). Естественно, реальный сценарий должен учитывать это, особенно если он выполняется в многопоточной серверной среде.

Заворачивать

Хотя вначале дорога была немного неровной, интеграция с Apache FOP теперь работает нормально. Так что если вы хотите проверить пример самостоятельно, он находится по адресу https://github.com/fappel/FOP

Хранилище P2 размещено по адресу http://fappel.github.io/FOP/.

Если вы столкнулись с проблемой или у вас есть вопросы или предложения, вы можете добавить проблему в проект GitHub или оставить комментарий в разделе ниже.

Ссылка: Интеграция Apache FOP с Eclipse и OSGi от нашего партнера по JCG Фрэнка Аппеля в блоге Code Affine .