2012-03-14 4 views
2

私の現在のワークフローは次のとおりです。生成されたXHTML文書を使用する際にURLリゾルバディレクトリを設定していますか?

  1. データベースからPOJOをロードします。
  2. Velocityに渡して、HTMLテンプレートをメモリ内にレンダリングします。
  3. 次に、出力されたHTMLをFlying SaucerとiTextを使用してPDFにレンダリングします。

画像などのような相対URLを解決しようとすると問題が発生します。私の文書はメモリに記憶されているので、イメージやスタイルシートの解決方法はまったく分かりません。どのようにして、メモリ内のStringオブジェクトにドキュメントを設定し、その中にリソースをロードするディレクトリを渡すことができますか?

String velocityOutput = VelocityEngineUtils.mergeTemplateIntoString(...); 

ByteArrayOutputStream output = new ByteArrayOutputStream(...); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocumentFromString(velocityOutput); 
renderer.layout(); 
renderer.createPDF(output); 

クライアントに電子メールで送信するレポートを生成するだけで、すべての処理をメモリ内で行う必要があります。 <img src="..."/>をHTMLテンプレートの相対URLをPDFに生成する際に解決するにはどうすればよいですか?

答えて

1

私は単純にJavaのDocumentインスタンスに私の文書をロードして、1回の呼び出しでリソースディレクトリでフライングソーサーにそれを送ることになった:特に注意する

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder() 
       .parse(new ByteArrayInputStream(templateOutput.getBytes("UTF-8"))); 

ITextRenderer renderer = new ITextRenderer(); 
renderer.setDocument(document, templateResourceDirectory); 
    renderer.layout(); 

OutputStream result = new ByteArrayOutputStream(); 

renderer.createPDF(result); 

ことの一つは、事実でありますFlying SaucerはファイルベースのURIの前にfile://という接頭辞が必要であり、正常に動作するためにはファイルパスの最後にスラッシュが必要であることを確認してください。

/var/www/cache   # FAIL 
file:///var/www/cache # ALSO FAIL 
file:///var/www/cache/ # WIN 
2

あなたはUserAgentCallbackインタフェースを実装したjavadocからrenderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);

でそれを設定する必要があります。

この場合、ユーザエージェントは、外部リソースを取得する責任があります。

独自のUACを作成する方法を理解するには、ライブラリに同梱されている 実装のいくつかをご覧ください({@link org.xhtmlrenderer.swing.NaiveUserAgent}など)。

関連する問題