Apache FOP ValidationException: propiedad no válido encontrado en "fo: inline": font-variant-ligaduras

sfwaer:

Estoy usando Apache FOP para convertir archivos PDF a FO. Durante la conversión, me encontré con la excepción a continuación:

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

El archivo FO se genera utilizando XSL-FO, un lenguaje de marcado de objetos con formato, que se utiliza en nuestro caso para convertir XHTML en bloques FO válidos. Sin embargo, algunas propiedades de estilo HTML y atributos no son compatibles con Apache FOP, pero que no bloqueen la generación de PDF (la font-variant-ligaturespropiedad de estilo en mi caso).

¿Cómo puedo ignorar la excepción y seguir generando mi PDF sin tener en cuenta la propiedad no válido?

sfwaer:

Para ignorar la excepción "invalidProperty" o cualquier otro evento al validar FO (ver más: https://xmlgraphics.apache.org/fop/2.3/events.html ), debe:

1- En primer lugar, crear un detector de eventos que interceptará este evento. Para ello se tiene que utilizar la org.apache.fop.events.EventListenerinterfaz y anular el processEventmétodo por el que describe el comportamiento de la FOP transformador cuando se enfrentan a la excepción.

Por ejemplo; puede crear un oyente que cambia el nivel excepción a ADVERTENCIA excepciones invalidProperty de modo que no bloquea la generación de 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- A continuación, usted tiene que registrar el detector de eventos con FOP, hacer llegar el EventBroadcaster que se asocia con el agente de usuario (FOUserAgent) y añadir allí:

// 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: Esto se realiza por separado para cada ciclo de procesamiento, es decir, para cada nuevo agente de usuario.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=314756&siteId=1
Recomendado
Clasificación