java - Apache FOP 验证异常 : Invalid property encountered on "fo:inline": font-variant-ligatures

标签 java pdf xsl-fo apache-fop

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

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

最佳答案

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

1- 首先,创建一个事件监听器来拦截此事件。为此,您必须使用 org.apache.fop.events.EventListener 接口(interface)并通过描述 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);

NB: This is done separately for each processing run, i.e. for each new user agent.

关于java - Apache FOP 验证异常 : Invalid property encountered on "fo:inline": font-variant-ligatures,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58059700/

相关文章:

java - Guava 18 无法使用 GWT 2.8Snapshot 和 Java 8 进行编译

c++ - 将 HTML 导出为 PDF(C++、Windows)

xml - 转换嵌套列表时验证错误

java - 正在寻找 :block in PDF generated by Apache FOP 0. 95

java - 在eclipse java项目中加载dll文件

java - 如何向服务器提交请求而不需要响应

java - 获取按钮在网格布局上的位置

php - 无法在 Laravel 5 中读取从 BLOB 转换回的 PDF?

java - 在 Flying Saucer 中使用符号

java - 在 FOP/XSL-FO 中插入图像