Apache FOP是由XSL格式化对象( XSL-FO )驱动的开源打印处理器。 例如,将数据对象转换为PDF可能非常有用。 但是,将其集成到PDE中并最终以OSGi Service的形式运行并最终显得有些麻烦。
因此,我提供了一个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输入文档。 基本用法摘要如下所示:
InputStream in = ... // the fo tree to processOutputStream out = ... // pdf destinationFopFactory 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
:
一旦这些到位,上面的代码就会编译。 如下所示,很容易开发一种具有用于生成带有签名的PDF format
方法的服务类:
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}
}
我编织了一个简单的用法示例项目,其中提供了更多详细信息。 该项目包含一个已经集成Apache FOP的example.target 。 导入项目后,在Eclipse工作区中解析并设置其目标定义 。 运行“ FOP示例”启动配置。 最后但并非最不重要的一点是,打开浏览器并转到URL http://localhost:10080/services/pdf
。
新创建的PDF应该可以下载了:
用于生成PDF的xml和xsl文档与嵌入式Apache FOP示例的ExampleXML2PDF类处理的文档相同。 PDF包含虚拟开发团队成员的简单列表。
请注意,“ Apache FOP当前可能不是完全线程安全的”(请参阅
Apache FOP:嵌入 )。 自然,现实情况必须考虑到这一点,尤其是在多线程服务器环境中运行时。
包起来
尽管开始时道路有些坎bump,但现在Apache FOP集成可以正常工作。 因此,如果您想自己检查示例,它位于https://github.com/fappel/FOP
P2存储库托管在http://fappel.github.io/FOP/
如果您遇到问题或有任何疑问或建议,可以在GitHub项目中添加问题,或在下面的部分中留下评论。
翻译自: https://www.javacodegeeks.com/2015/01/apache-fop-integration-with-eclipse-and-osgi.html