Java Apache FOP ValidationException:在上遇到无效属性;fo:inline";:字体变体连字
我正在使用ApacheFop将FO文件转换为PDF。在转换过程中,我遇到以下异常:Java Apache FOP ValidationException:在上遇到无效属性;fo:inline";:字体变体连字,java,pdf,xsl-fo,apache-fop,Java,Pdf,Xsl Fo,Apache Fop,我正在使用ApacheFop将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是一种用于格式化对象
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块。但是,apachefop不支持某些HTML样式的属性和属性,但它们不会阻止PDF的生成(在我的例子中是font-variant-ligations
style属性)
如何忽略异常并继续生成PDF而不考虑无效属性?FOP需要抱怨非XSL FO属性。XSL 1.1建议()包括: XSL名称空间中的元素具有扩展名称的属性(即具有非固定名称的属性)而不是本文档中定义的属性,这是一个错误 但是,如果为“轻松/不太严格的验证(如果可用)”添加
-r
命令行参数,则可能会收到较少的消息。(请参阅。)要在验证FO时忽略“invalidProperty”异常或任何其他事件(请参阅更多:),您必须:
1-首先,创建一个将拦截此事件的事件侦听器。为此,您必须使用org.apache.fop.events.EventListener
接口,并通过描述遇到异常时fop转换器的行为来重写processEvent
方法
比如,;您可以创建一个侦听器,将异常级别更改为invalidProperty异常警告,以便它不会阻止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注册事件侦听器,获取与用户代理(FousAgent)关联的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);
注意:这是针对每个处理运行单独进行的,即针对每个新的处理运行
用户代理