FOP и IKVM в .NET - изображения не работают

ОБНОВЛЕНИЕ 2: теперь он работает полностью! Прокрутите вниз, чтобы узнать, как ...
ОБНОВЛЕНИЕ: все работает! Ну ... частично. Прокрутите вниз, чтобы найти ответ ...

Я пытаюсь заставить свой FO-файл отображать внешнее изображение после его преобразования в PDF (или RTF, если на то пошло, , но я не уверен, могут ли RTF отображать изображения (они)) с FOP, но я не могу заставить его работать. (Вопрос, заданный здесь, отличается от моего.)

Я использую IKVM 0.46.0.1 и скомпилировал dll FOP 1.0 для установки в .NET; этот код работал нормально, когда я не пытался добавлять изображения:

private void convertFoByMimetype(java.io.File fo, java.io.File outfile, string mimetype)
{
    OutputStream output = null;

    try
    {
        FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
        // configure foUserAgent as desired

        // Setup outputput stream.  Note: Using BufferedOutputStream
        // for performance reasons (helpful with FileOutputStreams).
        output = new FileOutputStream(outfile);
        output = new BufferedOutputStream(output);

        // Construct fop with desired output format
        Fop fop = fopFactory.newFop(mimetype, foUserAgent, output);

        // Setup JAXP using identity transformer
        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(); // identity transformer

        // Setup input stream
        Source src = new StreamSource(fo);

        // Resulting SAX events (the generated FO) must be piped through to FOP
        Result res = new SAXResult(fop.getDefaultHandler());

        // Start XSLT transformation and FOP processing
        transformer.transform(src, res);
    }
    catch (Exception ex)
    ...
}

Однако когда я (а точнее преобразование DocBook2FO) добавил следующий код:

<fo:external-graphic src="url(images/interface.png)" width="auto" height="auto" content-width="auto" content-height="auto" content-type="content-type:image/png"></fo:external-graphic>

в файл FO изображение не отображалось. Я прочитал немного FAQ на сайте Apache, который говорит:

3.3. Почему моя графика не отображается?

Чаще всего внешний файл не находит FOP. Проверьте следующее:

Пустая или неправильная настройка baseDir.

Орфографические ошибки в имени файла (в том числе неправильный регистр).

...

Другие варианты мне не показались (в основном по причине ниже - «Странная часть»). Я пробовал это:

...
try
{
    fopFactory.setBaseURL(fo.getParent());
    FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
    foUserAgent.setBaseURL(fo.getParent());
    FOURIResolver fourir = fopFactory.getFOURIResolver();
    foUserAgent.setURIResolver(fourir);
    // configure foUserAgent as desired
...

безрезультатно.

Странная часть

Когда я использую реализацию FOP в командной строке, она работает нормально и без проблем отображает мое изображение. (Я не хочу идти по маршруту запускать командную строку из программы, потому что я не хочу заставлять пользователей устанавливать Java И платформу .NET, когда они хотят использовать мою программу.)
Файл png генерируется из GDI + из моего приложения (с использованием Bitmap.Save). Я также пробовал разные файлы png, но ни один из них у меня не работал.
Что мне может не хватать?

Большое спасибо за то, что зашли так далеко

ОБНОВЛЕНИЕ и возможный ответ

Так что я мог понять, почему это не сработало. Я потратил некоторое время на изучение кода (прежде чем просто скопировал его, не задумываясь об этом). Проблема действительно в неправильной настройке basedir.

Ключ находится в этом фрагменте кода:

    // Setup JAXP using identity transformer
    TransformerFactory factory = TransformerFactory.newInstance();
    Transformer transformer = factory.newTransformer(); // identity transformer

    // Setup input stream
    Source src = new StreamSource(fo);

    // Resulting SAX events (the generated FO) must be piped through to FOP
    Result res = new SAXResult(fop.getDefaultHandler());

    // Start XSLT transformation and FOP processing
    transformer.transform(src, res);

Здесь происходит преобразование идентичности, которое направляет свой результат в экземпляр FOP, который я создал ранее. Это эффективно изменяет базис перенаправленного FO на исполняемый файл приложения. Мне еще предстоит выяснить, как это сделать без преобразования и направить свой ввод непосредственно в FOP, но на данный момент я работал над этим, копируя свои изображения в каталог исполняемого файла.

Вот тут и возникла другая проблема. Теперь всякий раз, когда я пытаюсь выполнить код, я получаю исключение в строке с надписью transformer.transform(src, res);, что сбивает меня с толку, потому что ничего не говорит. ExceptionHelper говорит:

java.lang.ExceptionInInitializerError был пойман

и нет никакого внутреннего исключения или сообщения об исключении. Я знаю, что это сложно отладить только из того, что я написал, но я надеюсь, что это можно легко исправить.

Кроме того, это письмо кажется неясным, но ответа на него нет.

ОБНОВЛЕНИЕ2

Наконец, после нескольких бессонных ночей мне удалось заставить его работать одним из самых простых способов.

Я обновил IKVM, скомпилировал fop с новой версией и заменил ссылки IKVM новыми dll. Ошибка больше не возникает, и мое изображение отображается нормально.

Я надеюсь, что это когда-нибудь поможет кому-нибудь


person Slampisko    schedule 06.09.2011    source источник


Ответы (2)


Я использую очень похожий код, но без FOUserAgent, Resolvers и т. Д., И он отлично работает.

Вы пытались установить атрибут src в XSLT без функции url()?

Следующие утверждения могут помочь вам в дальнейшей диагностике проблемы:

java.lang.System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog")
java.lang.System.setErr(New java.io.PrintStream(New TraceStream(TraceStream.Level.Error)))
java.lang.System.setOut(New java.io.PrintStream(New TraceStream(TraceStream.Level.Info)))

Где TraceStream - это .NET-реализация java.io.OutputStream, которая записывает в ваш любимый регистратор. Я разместил версию пакета Common.Logging по адресу http://pastebin.com/XH1Wg7jn.

person wagi    schedule 12.09.2011
comment
Большое спасибо за ответ. Я попытался перейти в режим отладки и отредактировать файл на лету сразу после преобразования DocBook2FO, удалив оболочку url (), вернув ее обратно в fop. Ничего не изменилось. Я даже попытался отредактировать полный путь к изображению (file:// и все, что в комплекте) безрезультатно. Спасибо и за другое предложение, я посмотрю на него. - person Slampisko; 15.09.2011
comment
Вы пытались загрузить включаемый файл-образец-изображение (логотип-перо) вместо своего пользовательского изображения? У меня была аналогичная проблема с реализацией, которая не могла прочитать мой формат изображения ... - person wagi; 17.09.2011
comment
Просто попробовал. Изображение не отображалось. Я использовал xml_feather.gif файл из examples\fo\graphics. - person Slampisko; 20.09.2011

Вот сообщение, чтобы не оставлять вопрос без ответа, см. «Обновление 1» и «Обновление 2» в исходном сообщении для решения.

person Slampisko    schedule 05.10.2011