Apache FOP ValidationException: недопустимое свойство, встречающееся в "fo: inline": font-option-ligatures - PullRequest
2 голосов
/ 23 сентября 2019

Я использую 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, языка разметки для форматированных объектов, используемого в нашем случае для преобразования XHTML в действительные блоки FO.Однако некоторые свойства и атрибуты стиля HTML не поддерживаются Apache FOP, но они не блокируют генерацию PDF (в моем случае это свойство стиля font-variant-ligatures).

Как я могу игнорировать исключение и продолжать генерироватьмой PDF без учета недействительного свойства?

Ответы [ 2 ]

2 голосов
/ 23 сентября 2019

Чтобы игнорировать исключение "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);

Примечание: это делается отдельно для каждого прогона обработки, т. Е. Для каждого нового агента пользователя.

1 голос
/ 23 сентября 2019

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.)

...