2011-01-24 4 views
6

私はフライングソーサーを使用して、tomcatサーバー上でホストされているxhtmlからpdfを作成しています。 pdfに含まれる画像のほとんどは一般に公開されています(ロゴなど)が、ログイン後に保護されているものもあります(ログインしているとサーブレットを介してストリーミングされます)。フライングソーサー(ITextRenderer)で保護されたリソースを解決する

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

私の質問は次のとおりです。解決可能なフォントを追加するのと同じように、Flying Saucerのバイトストリームを解決する方法はありますか?私はthisのようなものを試しましたが、ITextRendererにUACを設定する簡単な方法はなく、試してみるたびに不平を言いました。

答えて

6

(テスト、リリース8で動作します)あなたはUserAgentCallbackをこのように設定することができ、そしてフライングソーサーは、URLを解決するためにそれを使用します。

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

MyUACがNaiveUserAgentを拡張する必要があり、としてresolveAndOpenStreamメソッドをオーバーライド他のページが示唆している。

+1

おかげで、これは、私のために働きました代わりに。 – ManiSto

+0

@ManiSto私はあなたが直面した正確な問題に直面しています。 MyUAC()の実装方法に関するサンプルコードを教えてください。 –

2

ITextUserAgentもソースからオーバーロードされていますが、ITextRendererが使用するように見えます。レンダラーオブジェクトから取得できるコンストラクターに出力デバイスを指定する必要があります。もう一つの問題は、setterメソッドを使って明示的に "共有コンテキスト"を設定しなければならないことでした。そうしないと、レンダリング中にNPEが取得されます。ここでは、オブジェクトを設定するためのコードは次のとおりです。

ITextRenderer renderer = new ITextRenderer(); 
MyUserAgentCallback uac = new MyUserAgentCallback(renderer.getOutputDevice()); 
uac.setSharedContext(renderer.getSharedContext()); 
renderer.getSharedContext().setUserAgentCallback(uac); 

はまた、ここでMyUserAgentCallbackの基本的な考え方は、基本認証を使用して、次のとおりです。私はITextUserAgentクラスを拡張ものの

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? 
    } 
} 
関連する問題