使用Apache FOP输出到PDF时如何输出富文本(html)字段内容

时间:2015-04-09 23:03:25

标签: xpages apache-fop

我正在尝试按照Stephen Wissel的建议使用xAgent和Apache FOP生成PDF文件:http://www.wissel.net/blog/d6plinks/SHWL-8TNLTV。大多数过程都运行正常,调用xAgent,从我的文档创建XML并将其传递给转换以输出PDF。我只是坚持如何处理富文本字段。这些字段包含用户生成的内容(在xPage中创建),因此包含HTML片段。有没有人想出一个很好的方法将富文本字段和其他内容输出到PDF?

2 个答案:

答案 0 :(得分:1)

您的用户仅使用CKEditor创建并填充XPage中的RichText字段。这是转换为pdf的良好前提。您的Richtext字段是HTML格式。

使用以下步骤:

  1. 将您的HTML转换为XHTML。 JTidy是一个很好的工具。 XHTML具有比HTML更强的语法,并且更容易以这种方式转换为FOP。
  2. 将AntennaHouse的xhtml2fo.xsl集成到您的XSL中。有adapted extended version可用,效果很好。

答案 1 :(得分:0)

RichText是[插入不可打印的东西]。有很多考虑因素:

  • 您是否需要RichText的完整客户端美容(标签表,OLE,部分,悬停等)?
  • RichText的HTML表示是否足够好(当您通过浏览器查看它时 - 最终通过AppsFidelity )?

在前一种情况下,你可能唯一的途径是抓住DXL表现并尝试转换那个 - 我玩过它,这似乎是可行的但是漫长而痛苦的道路。

在后一种情况下,您首先要了解HTML表示。这可以使用?OpenField命令或code snipped by Mark

来完成

现在您有了HTML,您可能希望使用jsoup进行清理,然后将其转换为XSL:FO。一些指导可以在这里找到:

不幸的是,不是复制/粘贴解决方案,但可能是可行的。让我们知道它是如何发展的,XPages和Domino的主题似乎是一般兴趣

<强>更新
要成功转换HTML,您需要将其转换为xHTML。这大致类似于:

org.jsoup.nodes.Document hDoc = Jsoup.parse(source);
String cleanHTML = hDoc.body().html();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
InputSource source = new InputSource(new StringReader(cleanHTML));
DocumentBuilder docb = factory.newDocumentBuilder();
Document d = docb.parse(source);
return d;

对于XSLT转换,您不需要先查看完整文档,InputSource可以很好地完成。

沿着这些方向......

   /* Stylesheet most likely would come from a getResourceAsStream */
   public String getFO(String rawHTML, InputStream styleStream) {
        org.jsoup.nodes.Document hDoc = Jsoup.parse(rawHTML);
        String cleanHTML = hDoc.body().html();
        InputSource source = new InputSource(new StringReader(cleanHTML));
        StreamSource style = new StreamSource(styleStream);
        TransformerFactory tFactory = TransformerFactory.newInstance();
        Transformer transformer = tFactory.newTransformer(style);
        StreamResult xResult = new StreamResult(new StringWriter());
        transformer.setOutputProperty("omit-xml-declaration", "yes");
        transformer.transform(source, xResult);
        String result = xResult.getWriter().toString();
        return result;
   }

当然你需要添加错误处理等。让我们知道它是怎么回事