Можно ли разрешить CSS как ресурс classpath с помощью Flying Saucer (XHTML-Renderer)?
Я пытаюсь упаковать ресурсы в банку, но у меня не получается заставить Flying Saucer найти css на пути к классам - я не могу с легкостью создать URL-адрес, чтобы можно было легко решить эту проблему.
Есть ли у летающей тарелки способ указания пакетов ресурсов в пути к классам для разрешения элементов и изображений?
Примечание: я запускаю это в приложении веб-запуска, у которого нет разрешений на запись в файловую систему, поэтому расширение jar на самом деле не вариант.
3 ответа
Вы должны реализовать 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());
Мое решение
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()));
Казалось бы, у летающей тарелки нет способа указать ресурсы на пути к классам, поэтому я работаю над созданием обработчика URL-адреса classpath: protocol в связанном вопросе.
Результаты реализации
Казалось бы, некоторые предпосылки этого вопроса недействительны. После написания собственного загрузчика URL-адреса classpath я обнаружил, что вам нужно запросить <all-permissions/>
в jnlp, чтобы иметь возможность использовать URL.setURLStreamHandlerFactory()
, На самом деле, вам нужно запросить все разрешения, чтобы сделать что-то необычное (даже если вы только изменяете свою собственную песочницу). Смотрите полный список здесь.
Короче говоря, это означает, что я могу извлекать файлы в операционную систему. Но сейчас приятно иметь загрузчик classpath...