是否可以使用Flying Saucer(XHTML-Renderer)将css解析为类路径资源?

时间:2009-11-17 09:19:13

标签: java css xhtmlrenderer flying-saucer

我正在尝试将资源打包到jar中,但是我无法让Flying Saucer在类路径上找到css - I can't construct a URL easily to be able to resolve this seamlessly

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

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

3 个答案:

答案 0 :(得分:4)

您应该实现一个您提供给XHTMLPanel的UserAgentCallback,如下所示:

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());

答案 1 :(得分:3)

我的解决方案是

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()));

答案 2 :(得分:0)

飞碟似乎没有办法在类路径上指定资源,所以我通过制作classpath: protocol url handler at the linked question

来解决这个问题。

实施后结果

这个问题的某些前提似乎无效。编写自己的类路径URL加载器后,我发现您需要在jnlp中请求<all-permissions/>才能使用URL.setURLStreamHandlerFactory()。实际上,您需要请求所有权限才能执行任何奇特的操作(即使您只修改自己的沙盒)。请参阅the full list here

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