Java 是否可以使用飞碟(XHTML渲染器)将css解析为类路径资源?

Java 是否可以使用飞碟(XHTML渲染器)将css解析为类路径资源?,java,css,xhtmlrenderer,flying-saucer,Java,Css,Xhtmlrenderer,Flying Saucer,我正试图将资源打包到一个jar中,但是我在让flyingdiscer在类路径上找到css时遇到了问题- 飞碟有办法在类路径上指定资源包来解析项目和图像吗 注意:我在一个没有文件系统写入权限的webstart应用程序中运行它,因此jar扩展不是一个真正的选项。飞碟似乎没有在类路径上指定资源的方法,所以我通过 实施后的调查结果 似乎这个问题的某些前提是无效的。在编写了我自己的类路径URL加载器之后,我发现您需要请求 简而言之,这意味着我能够将文件解压缩到操作系统。但是现在有一个类路径加载器是很好的…

我正试图将资源打包到一个jar中,但是我在让flyingdiscer在类路径上找到css时遇到了问题-

飞碟有办法在类路径上指定资源包来解析项目和图像吗


注意:我在一个没有文件系统写入权限的webstart应用程序中运行它,因此jar扩展不是一个真正的选项。

飞碟似乎没有在类路径上指定资源的方法,所以我通过

实施后的调查结果 似乎这个问题的某些前提是无效的。在编写了我自己的类路径URL加载器之后,我发现您需要请求


简而言之,这意味着我能够将文件解压缩到操作系统。但是现在有一个类路径加载器是很好的…

您应该实现一个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()));

如果您展示一个关于如何加载文件以及文件本身的小示例,您将有更好的机会得到答案。假设FS使用URLConnection来加载样式表,那么引用问题中的答案应该可以做到这一点(尽管它们实际上没有显示添加URL方案解析器的代码)。