java - Apache FOP ValidationException:在“fo:inline”上遇到无效属性:font-variant-ligatures
问题描述
我正在使用 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?
解决方案
要在验证 FO 时忽略“invalidProperty”异常或任何其他事件(请参阅更多:https ://xmlgraphics.apache.org/fop/2.3/events.html ),您必须:
1-首先,创建一个将拦截此事件的事件侦听器。为此,您必须使用接口并通过描述 FOP Transformer 在遇到异常时的行为来org.apache.fop.events.EventListener
覆盖该方法。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);
注意:这是针对每个处理运行单独完成的,即针对每个新用户代理。
推荐阅读
- android - 我的应用程序运行成功,但有一些致命错误
- maven - Eclipse 中的 Maven 构建失败(测试和插件)
- graph - 某算法 O(|E|log|E|) VS O(|E|log|V|) Graphs
- javascript - Asp.net MVC 使用 ajax 调用从当前视图页面重定向到另一个视图
- javascript - Javascript 和 Python 的跨码哈希
- magento - Magento 2 Authorize.net 支付失败问题
- angularjs - ng-click 内的一种数据绑定方式
- python-2.7 - 是否可以使用带有流输入和输出的机器学习库?
- php - 通过android传递数据时php $_REQUEST不起作用
- javascript - 过滤 ul 中的 li 元素并保留路径