【问题标题】:How to output rich text (html) field content when outputting to PDF using Apache FOP使用 Apache FOP 输出到 PDF 时如何输出富文本 (html) 字段内容
【发布时间】:2015-04-09 23:03:24
【问题描述】:

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

丰富

【问题讨论】:

  • 我没有直接使用 xAgent 和 Apache FOP,但是当我使用 FOP 产品生成 PDF 时,我需要通过 XSL 将 HTML 转换为 FOP 可以理解的格式。 '' 编辑:试图找出代码格式
  • 如果你得到这个工作,请在 OpenNTF 作为一个 sn-p 发布!

标签: xpages apache-fop


【解决方案1】:

您的用户仅使用 CKEditor 在 XPages 中创建和填充 RichText 字段。这是转换为pdf的一个很好的先决条件。您的 Richtext 字段采用 HTML 格式。

使用以下步骤:

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

【讨论】:

  • Fop 确实支持内联图像 - 因此在使用 JTidy 或 jsoup 进行 HTML 预处理时可能需要一些额外的魔法
【解决方案2】:

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;
   }

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

【讨论】:

  • 我只需要 html 表示,因为它都是在 xpage 上创建的,并存储为 MIME/Html。我已经从字段中检索了 HTML 片段作为字符串,现在我想我只需要将它转换为 DOM 树。 jTidy 确实提供了直接使用 DOM 文档的可能性,但已经有一段时间没有更新了。 jsoup 有自己的树,需要进一步改造。我确实看到了 DeveloperWorks 文章,并且一直在审查/比较它与 Antenna House 样式表。这两个似乎都期望一个完整的 HTML 文档并设置页面和所有内容。
  • 我成功地使用 jsoup 将 HTML 清理为 xhtml - 这正是您所需要的。一旦它是有效的 XML,标准的 Java XML Dom 方法就会很好地工作。我会在我的电脑旁边挖掘“曾经编写过的代码”的盒子,看看我是否能找到示例
  • 我看到,soup 也有一个帮助类,它将返回一个 w3c dom 文档,所以我应该能够在将它传递给转换之前使用它与我的其他内容合并。这就是我将要尝试的,我会报告我的成功。
猜你喜欢
  • 1970-01-01
  • 2013-02-07
  • 2011-07-18
  • 2011-10-26
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多