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