2

これが私の現在のワークフローです:

  1. データベースから POJO をロードします。
  2. それらを Velocity に渡し、HTML テンプレートをメモリ内でレンダリングします。
  3. 次に、Flying Saucer と iText を使用して、出力された HTML を 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="..."/>PDF に生成されたときに、HTML テンプレートで相対 URL を解決するにはどうすればよいですか?

4

2 に答える 2

2

UserAgentCallbackインターフェースを実装し、それを設定する必要がありますrenderer.getSharedContext().setUserAgentCallback(myUserAgentCallback);

javadoc から:

この場合のユーザー エージェントは、外部リソースの取得を担当します。

独自の UAC を作成する方法を理解するには、{@link org.xhtmlrenderer.swing.NaiveUserAgent} など、ライブラリに同梱されている実装を確認することをお勧めします。

于 2012-03-16T18:16:14.510 に答える
1

結局、ドキュメントをJavaDocumentインスタンスにロードし、それを1回の呼び出しでリソースディレクトリとともにFlyingSaucerに送信することになりました。

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);

特に注意すべき点の1つは、Flying SaucerではファイルベースのURIの前に。を付けるfile://必要があり、正しく機能するにはファイルパスの最後にスラッシュが必要であるという事実です。

/var/www/cache         # FAIL
file:///var/www/cache  # ALSO FAIL
file:///var/www/cache/ # WIN
于 2012-03-16T18:58:55.210 に答える