Чтобы игнорировать исключение "invalidProperty" или любое другое событие при проверке FO (см. Подробнее: https://xmlgraphics.apache.org/fop/2.3/events.html),, необходимо:
1- Сначала создайте прослушиватель событий, который будет перехватывать это событие.Для этого вам необходимо использовать интерфейс org.apache.fop.events.EventListener
и переопределить метод processEvent
, описав поведение преобразователя FOP при обнаружении исключения.
Например, вы можете создать прослушиватель, который изменяет уровень исключенияв WARNING для недопустимых исключенийProperty, чтобы он не блокировал генерацию 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, получить EventBroadcaster, связанный с пользовательским агентом (FOUserAgent) и добавьте его туда:
// 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);
Примечание: это делается отдельно для каждого прогона обработки, т. Е. Для каждого нового агента пользователя.