6

Flying Saucer を使用して、Tomcat サーバーでホストされている xhtml から pdf を作成しています。PDF に含まれるほとんどの画像 (ロゴなど) は公開されていますが、一部の画像はログインの背後で保護されています (つまり、ユーザーがログインしている場合、画像はサーブレットを介してストリーミングされます)。

ブラウザにURLを貼り付けると、ブラウザがリクエストでセッションを送信するため、画像はもちろん正常に表示されます。ただし、Flying Saucer が pdf をレンダリングするとき、セッションについて何も知らないため、保護された画像は含まれません。

だから、私の質問は; 解決可能なフォントを追加できるように、フライングソーサーが解決するバイトストリームを含める方法はありますか? 私はこのようなことを試しましたが、ITextRenderer に UAC を設定する簡単な方法はなく、試行するたびに文句を言いました。

4

2 に答える 2

7

このように UserAgentCallback を設定すると、Flying Saucer はそれを使用して URL を解決します (テスト済み、Release 8 で動作します)。

ITextRenderer renderer = new ITextRenderer();
renderer.getSharedContext().setUserAgentCallback(new MyUAC());

MyUAC は を拡張し、他のページが示唆するようにメソッドをNaiveUserAgentオーバーライドする必要があります。resolveAndOpenStream

于 2011-02-18T17:43:42.553 に答える
2

私は ITextUserAgent もオーバーライドしました - ソースから、それが ITextRenderer が使用しているように見えます。コンストラクターで出力デバイスを提供する必要があります。これは、レンダラー オブジェクトから取得できます。もう 1 つの落とし穴は、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?
    }
}
于 2012-03-19T14:37:59.620 に答える