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-ligatures
propiedad 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?
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.EventListener
interfaz y anular el processEvent
mé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.