Можно ли разрешить CSS как ресурс classpath с помощью Flying Saucer (XHTML-Renderer)? - PullRequest
4 голосов
/ 17 ноября 2009

Я пытаюсь упаковать ресурсы в банку, но у меня проблемы с тем, чтобы Flying Saucer нашел css на пути к классам - Я не могу с легкостью создать URL-адрес, чтобы можно было легко решить эту проблему .

Есть ли у Летающей тарелки способ указания пакетов ресурсов на пути к классам для разрешения элементов и изображений?

Примечание: я запускаю это в приложении веб-запуска, у которого нет разрешения на запись в файловую систему, поэтому расширение jar на самом деле не вариант.

Ответы [ 3 ]

4 голосов
/ 22 мая 2010

Вы должны реализовать UserAgentCallback, который вы передаете в XHTMLPanel, что-то вроде этого:

private static class UAC extends NaiveUserAgent {
    @Override
    public String resolveURI(String uri) {
        return uri;
    }

    @Override
    protected InputStream resolveAndOpenStream(String uri) {
        java.io.InputStream is = null;
        URL url = UAC.class.getResource(uri);
        if (url == null) {
            XRLog.load("Didn't find resource [" + uri + "].");
            return null;
        }
        try {
            is = url.openStream();
        }
        catch (java.net.MalformedURLException e) {
            XRLog.exception("bad URL given: " + uri, e);
        }
        catch (java.io.FileNotFoundException e) {
            XRLog.exception("item at URI " + uri + " not found");
        }
        catch (java.io.IOException e) {
            XRLog.exception("IO problem for " + uri, e);
        }
        return is;
    }
}

XHTMLPanel panel = new XHTMLPanel(new UAC());
3 голосов
/ 23 июня 2016

Мое решение

private static class UserAgentCallback extends ITextUserAgent {
    public UserAgentCallback(ITextOutputDevice outputDevice, SharedContext sharedContext) {
        super(outputDevice);
        setSharedContext(sharedContext);
    }

    @Override
    public String resolveURI(String uri) {
        return uri;
    }

    @Override
    protected InputStream resolveAndOpenStream(String uri) {
        java.io.InputStream is = null;
        URL url = null;
        try {
            url = new ClassPathResource("/META-INF/pdfTemplates/" + uri).getURL();
        } catch (IOException e) {
            XRLog.exception("bad URL given: " + uri, e);
        }
        if (url == null) {
            XRLog.load("Didn't find resource [" + uri + "].");
            return null;
        }
        try {
            is = url.openStream();
        } catch (java.net.MalformedURLException e) {
            XRLog.exception("bad URL given: " + uri, e);
        } catch (java.io.FileNotFoundException e) {
            XRLog.exception("item at URI " + uri + " not found");
        } catch (java.io.IOException e) {
            XRLog.exception("IO problem for " + uri, e);
        }
        return is;
    }
}

и вызов:

renderer.getSharedContext()
                .setUserAgentCallback(new UserAgentCallback(renderer.getOutputDevice(), renderer.getSharedContext()));
0 голосов
/ 20 ноября 2009

Казалось бы, у летающей тарелки нет способа указать ресурсы на пути к классам, поэтому я работаю над созданием обработчика URL-адреса classpath: protocol в связанном вопросе

Выводы по реализации

Казалось бы, некоторые предпосылки этого вопроса неверны. После написания собственного загрузчика URL-адресов classpath я обнаружил, что вам нужно запросить <all-permissions/> в jnlp, чтобы иметь возможность использовать URL.setURLStreamHandlerFactory(). На самом деле, вам нужно запросить все разрешения, чтобы сделать что-нибудь необычное (даже если вы только изменяете свою собственную песочницу). Смотрите полный список здесь .

Короче говоря, это означает, что я могу извлекать файлы в операционную систему. Но сейчас приятно иметь загрузчик classpath ...

...