2011-12-06 4 views
6

Flying-Saucerを使用してHTMLページをPDFにレンダリングしようとしています。 HTMLはHTMLをPDFにレンダリングしながら、フライングソーサーでベースURLを設定するにはどうすればよいですか?

renderer.setDocumentFromString(new String(htmlByteArray)); 

としてメモリ内に作成し、レンダラに渡されている問題は、私はHTMLで<img src="images.jpg"/>を持っており、それが最終的なHTMLでレンダリング取得されていないということです。イメージは、パッケージ内のresourcesフォルダにあります。

は、私は次のようにベースURLを設定しようとしたが、成功しません:

 
ITextRenderer renderer = new ITextRenderer(); 
renderer.getSharedContext().setBaseURL("com/org/tools/designer/resources/"); 
System.out.println(renderer.getSharedContext().getBaseURL()); 
renderer.setDocumentFromString(new String(htmlByteArray)); 
renderer.layout(); 
renderer.createPDF(os); 
+0

を介してすべてのリソース要求を指示でしょう、あなたのUserAgentCallbackにこれを設定することができますが、あなたは** 'URLを実際のベースとsetBaseURL'を試みたことがありますか?例えば。 'file:/// ---パスへのパス--- com/org/tools/designer/resources /' – mkl

答えて

3

は、すべてあなた自身のリソースを取得することができますUserAgentCallbackと呼ばれるFSで本当にクールなインターフェイスをtheresの。これを見ている他の人々のためにそれに応じて、URLを設定することができます:あなたがここに特殊なケースを持っているしかし

renderer.getSharedContext().getUserAgentCallback().setBaseURL("url_to_resources"); 

は、あなたがアクセスするために特別な方法が必要ですあなたのjarファイル内に埋め込まれたリソースを持っています。自分で実装することができますUserAgentCallback Heres私はあなたのために書きました。 (私はこれをテストしていないので、少しデバッグする必要があります)。

このコードビットはITextUserAgentを拡張し、getBinaryResourceメソッドを上書きして残りをライブラリに残すだけで済みます。これがうまく動作しない場合は、UserAgentCallbackの完全な実装を調べることができます。

import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import org.xhtmlrenderer.pdf.ITextOutputDevice; 
import org.xhtmlrenderer.pdf.ITextUserAgent; 

public class PackageUserAgentCallback extends ITextUserAgent { 
    private Class resourceClass; 

    public PackageUserAgentCallback(ITextOutputDevice outputDevice, Class resourceClass) { 
     super(outputDevice); 
     this.resourceClass = resourceClass; 
    } 

    @Override 
    public byte[] getBinaryResource(String uri) { 
     try { 
      InputStream in = resourceClass.getResourceAsStream(uri); 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      int numRead; 
      byte [] buffer = new byte[256]; 
      while((numRead = in.read(buffer)) != -1) { 
       out.write(buffer, 0, numRead); 
      } 
      return out.toByteArray(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

} 

その後、あなたはこれがあなたのPackageUserAgentCallback

ITextRenderer renderer = new ITextRenderer(); 
renderer.getSharedContext().setUserAgentCallback(
     new PackageUserAgentCallback(renderer.getOutputDevice(), Resources.class)); 
System.out.println(renderer.getSharedContext().getBaseURL()); 
renderer.setDocumentFromString(new String(htmlByteArray)); 

renderer.layout(); 
renderer.createPDF(os); 
関連する問題