当前位置: 首页 > 知识库问答 >
问题:

Apache FOP ValidationException:在“fo:inline”:字体变量连字上遇到无效属性

单于轶
2023-03-14

我正在使用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块。但是,Apache FOP 不支持某些 HTML 样式属性和属性,但它们不会阻止 PDF 生成(在我的情况下是字体变体连字样式属性)。

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

共有2个答案

凌朗
2023-03-14

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。

高朝明
2023-03-14

若要在验证FO时忽略无效属性异常或任何其他事件(请参阅更多:https://xmlgraphics.apache.org/fop/2.3/events.html),您必须:

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

例如;您可以创建一个侦听器,将异常级别更改为警告无效属性异常,以便它不会阻止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);

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

 类似资料:
  • 问题内容: 我用来解码以下json字符串。 这是一个用Python编写的演示: 解码器将抛出: 如何应对呢?预期的输出是: 问题答案: “ \ s”不是有效的JSON转义字符串。 根据json.org,仅以下转义有效 \“ \\ / \ b \F \ n \ r \ t \ u 四十六进制数字

  • 问题内容: 在我的上一个网站上,该文本在chrome和firefox上自然是完美的,而无需触摸字体平滑或其他任何内容。 但是在Mac / Safari 7上,文本看起来很好,然后立即变细(太细/不好看)。 在此处输入图片说明 在此处输入图片说明 经过一些研究和一些测试 看起来Safari首先显示带有以下内容的文本: 然后,在获得闪烁效果后,将字体变为: 所以在我看来,我别无选择,只能强迫 使我的网

  • 问题内容: 我有一个Spring Roo + Hibernate项目,该项目需要从客户端应用程序输入JTS知名文本(WKT)字符串,然后将其转换为JTSGeometry对象,然后尝试将其写入PostGIS数据库。我在JDBC连接和类型方面遇到了一些问题,但这些问题似乎已通过以下方式解决: 转换完成: 但是现在,当Hibernate尝试将我的Geometry对象写入数据库时​​,我得到一个错误: 似

  • 字体尺寸(font-size) 我们在CSS尺寸单位一课中已经讲解过,用来设置文本显示大小。 p{ font-size: 16px;} 记住设置字体尺寸(font-size)为 16px 不表示每个字符都是 16px 高,实际尺寸还取决于每个字符所用的字体族(font-family)。 字体风格(font-style) 有3种字体样式:正常体(normal)、斜体(italic)和倾斜(obliq

  • 为什么上面的无效字符是常量,这在JavaScript中工作得很完美。我想显示英尺和英寸的高度,并且使用了这个客户端,但是当我在服务器端使用相同的高度时,它显示。

  • 我的编码似乎有什么问题?为什么字体不会改变?我已经在资产/字体文件夹下导入了字体。有了这个,我将xml和java文件附加在一起 XML文件 JAVA文件