Java 使用飞碟(ITextRenderer)解析受保护资源

Java 使用飞碟(ITextRenderer)解析受保护资源,java,pdf,resolve,flying-saucer,xhtmlrenderer,Java,Pdf,Resolve,Flying Saucer,Xhtmlrenderer,我正在使用飞碟从托管在tomcat服务器上的xhtml创建pdf。pdf中包含的大多数图像都是公开的(徽标等),但其中一些图像在登录后受到保护(也就是说,如果用户登录,它们将通过servlet流式传输) 当我在浏览器中粘贴url时,图像当然会显示得很好,因为浏览器会发送带有请求的会话。但是,当飞碟渲染pdf时,它不包含受保护的图像,因为它不知道有关会话的任何信息 所以我的问题是,;是否有任何方法可以像添加可解析字体一样,包含flyingdiscer要解析的字节流?我尝试过类似的方法,但没有简单的

我正在使用飞碟从托管在tomcat服务器上的xhtml创建pdf。pdf中包含的大多数图像都是公开的(徽标等),但其中一些图像在登录后受到保护(也就是说,如果用户登录,它们将通过servlet流式传输)

当我在浏览器中粘贴url时,图像当然会显示得很好,因为浏览器会发送带有请求的会话。但是,当飞碟渲染pdf时,它不包含受保护的图像,因为它不知道有关会话的任何信息


所以我的问题是,;是否有任何方法可以像添加可解析字体一样,包含flyingdiscer要解析的字节流?我尝试过类似的方法,但没有简单的方法在ITextRenderer上设置UAC,每次我尝试时它都会抱怨。

您可以这样设置UserAgentCallback,飞碟将使用它解析URL(经过测试,适用于第8版):


MyUAC应该扩展NaiveUserAgent,并按照另一个页面的建议重写
resolveAndOpenStream
方法。

我也重写了ITextRenderer代理-从源代码看,这就是ITextRenderer使用的方法。您必须在构造函数中提供输出设备,可以从renderer对象获得该设备。另一个问题是,您必须使用setter方法显式设置“共享上下文”-否则您将在渲染期间获得NPE。以下是设置对象的代码:

ITextRenderer renderer = new ITextRenderer();
MyUserAgentCallback uac = new MyUserAgentCallback(renderer.getOutputDevice());
uac.setSharedContext(renderer.getSharedContext());
renderer.getSharedContext().setUserAgentCallback(uac);
此外,以下是MyUserAgentCallback使用基本身份验证的基本思想:

private static class MyUserAgentCallback extends ITextUserAgent
{
    public MyUserAgentCallback(ITextOutputDevice outputDevice)
    {
        super(outputDevice);
    }

    @Override
    protected InputStream resolveAndOpenStream(String uri) 
    {
        if (_isProtectedResource(uri))
        {
            java.io.InputStream is = null;
            uri = resolveURI(uri);
            try {
                URL url = new URL(uri);
                String encoding = new BASE64Encoder().encode ("username:password".getBytes());
                URLConnection uc = url.openConnection();
                uc.setRequestProperty  ("Authorization", "Basic " + encoding);
                is = uc.getInputStream();
                Log.debug("got input stream");
            }
            catch (java.net.MalformedURLException e) {
                Log.error("bad URL given: " + uri, e);
            }
            catch (java.io.FileNotFoundException e) {
                Log.error("item at URI " + uri + " not found");
            }
            catch (java.io.IOException e) {
                Log.error("IO problem for " + uri, e);
            }
            return is;
        }
        else
        {
            return super.resolveAndOpenStream(uri);
        }
    }

    private boolean _isProtectedResource(String uri)
    {
        // does this require authentication?
    }
}

谢谢,虽然我扩展了iTextureAgent类,但这对我很有效。@ManiSto我面临的正是您所面临的问题。你能给我一些关于如何实现MyUAC()的示例代码吗?
private static class MyUserAgentCallback extends ITextUserAgent
{
    public MyUserAgentCallback(ITextOutputDevice outputDevice)
    {
        super(outputDevice);
    }

    @Override
    protected InputStream resolveAndOpenStream(String uri) 
    {
        if (_isProtectedResource(uri))
        {
            java.io.InputStream is = null;
            uri = resolveURI(uri);
            try {
                URL url = new URL(uri);
                String encoding = new BASE64Encoder().encode ("username:password".getBytes());
                URLConnection uc = url.openConnection();
                uc.setRequestProperty  ("Authorization", "Basic " + encoding);
                is = uc.getInputStream();
                Log.debug("got input stream");
            }
            catch (java.net.MalformedURLException e) {
                Log.error("bad URL given: " + uri, e);
            }
            catch (java.io.FileNotFoundException e) {
                Log.error("item at URI " + uri + " not found");
            }
            catch (java.io.IOException e) {
                Log.error("IO problem for " + uri, e);
            }
            return is;
        }
        else
        {
            return super.resolveAndOpenStream(uri);
        }
    }

    private boolean _isProtectedResource(String uri)
    {
        // does this require authentication?
    }
}