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 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目标定义中:

Apache OpenNLP教程 apache fop_Apache OpenNLP教程

现在定义应该包含处理器的捆绑软件的依赖关系。 这些依赖性是org.apache.servicemix.bundles.foporg.apache.servicemix.bundles.xmlgraphics-commons

Apache OpenNLP教程 apache fop_java_02

一旦这些到位,上面的代码就会编译。 如下所示,很容易开发一种具有用于生成带有签名的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应该可以下载了:

Apache OpenNLP教程 apache fop_java_03

用于生成PDF的xml和xsl文档与嵌入式Apache FOP示例的ExampleXML2PDF类处理的文档相同。 PDF包含虚拟开发团队成员的简单列表。

Apache OpenNLP教程 apache fop_java_04

请注意,“ 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