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

How to output rich text (html) field content when outputting to PDF using Apache FOP

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

富有

RichText 是 [插入无法打印的内容]。有几个注意事项:

  • 您是否需要 RichText 的完整客户端美感(选项卡式表格、OLE、部分、悬停等)?
  • RichText 的 HTML 表示是否足够好(当您通过浏览器查看它时 - 最终被 AppsFidelity 丰富)?

在前一种情况下,您可能唯一的途径是获取 DXL 表示并尝试转换它 - 我试过了,这似乎是可行的,但这是一条漫长而痛苦的道路。

在后一种情况下,您首先会接触到 HTML 表示。这可以使用 ?OpenField command or the code snipped by Mark.

来完成

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

不幸的是,这不是 copy/paste 解决方案,但可以实现。让我们知道进展如何,该主题似乎对 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;
   }

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

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

使用以下步骤:

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