【问题标题】:Apache FOP ValidationException: Invalid property encountered on "fo:inline": font-variant-ligaturesApache FOP ValidationException:在“fo:inline”上遇到无效属性:font-variant-ligatures
【发布时间】:2020-01-23 08:41:18
【问题描述】:

我正在使用 Apache FOP 将 FO 文件转换为 PDF。在转换过程中,我遇到了以下异常:

javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Invalid property encountered on "fo:inline": font-variant-ligatures (See position 1222:1124)

FO 文件是使用 XSL-FO 生成的,这是一种格式化对象的标记语言,在我们的例子中用于将 XHTML 转换为有效的 FO 块。但是,Apache FOP 不支持某些 HTML 样式属性和属性,但它们不会阻止 PDF 生成(在我的例子中是 font-variant-ligatures 样式属性)。

如何忽略异常并继续生成我的 PDF 而不考虑无效属性?

【问题讨论】:

    标签: java pdf xsl-fo apache-fop


    【解决方案1】:

    要在验证 FO 时忽略“invalidProperty”异常或任何其他事件(查看更多:https://xmlgraphics.apache.org/fop/2.3/events.html),您必须:

    1- 首先,创建一个将拦截此事件的事件侦听器。为此,您必须使用org.apache.fop.events.EventListener 接口并通过描述FOP Transformer 在遇到异常时的行为来覆盖processEvent 方法。

    例如;您可以创建一个侦听器,将 invalidProperty 异常的异常级别更改为 WARNING,这样它就不会阻止 PDF 生成。

    private static class InvalidPropertyEventListener implements EventListener {
    
        /**
         * Continues processing even if an <code>invalidProperty</code> runtimeException was thrown
         * during FO to PDF transformation.
         * <p>
         * Descends the event's severity level to WARN to avoid the exception throwing.
         *
         * @param event The event to be processed.
         */
        public void processEvent(Event event) {
            if ("org.apache.fop.fo.FOValidationEventProducer.invalidProperty".equals(event.getEventID())) {
                event.setSeverity(EventSeverity.WARN);
            }
        }
    }
    

    2- 接下来,您必须向 FOP 注册事件侦听器,获取与用户代理 (FOUserAgent) 关联的 EventBroadcaster 并将其添加到那里:

    // Adding FOP eventListeners
    FOUserAgent userAgent = Factory.getInstance().getFactory().newFOUserAgent();
    userAgent.getEventBroadcaster().addEventListener(getInvalidPropertyEventListener());
    Fop fop = Factory.getInstance().getFactory().newFop(MimeConstants.MIME_PDF, userAgent, output);
    
    // Transform the FO to PDF
    Result res = new SAXResult(fop.getDefaultHandler());
    Source src = new StreamSource(foSource);
    Transformer transformer = TRANSFACTORY.newTransformer();
    transformer.transform(src, res);
    

    注意:这是针对每个处理运行单独完成的,即对于每个新的 用户代理。

    【讨论】:

      【解决方案2】:

      FOP 需要抱怨非 XSL-FO 属性。 XSL 1.1 建议 (https://www.w3.org/TR/xsl11/#xsl-namespace) 包括:

      如果 XSL 命名空间中的元素具有扩展名称的属性,但该属性具有空命名空间 URI(即,具有无前缀名称的属性),而不是本文档中定义的属性。

      但是,如果为“宽松/不太严格的验证(如果可用)”添加-r 命令行参数,您可能会收到更少的消息。 (见https://xmlgraphics.apache.org/fop/2.3/running.html。)

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多