4

Spring MVC コントローラーを String にレンダリングして、iText を使用して PDF を作成しようとしています。アプリケーションはOracle Access Managerの背後にあるため、ページのURLにURLリクエストを送信して出力を文字列に保存することはできません。別のHTTPリクエストを作成せずにページをレンダリングする必要があります。

私の目標は、次のようなことをすることです。

MyMvcController controller = new MyMvcController();
ModelAndView modelAndView = new ModelAndView("TemplateName");

...
modelAndView.addObject(someObject);
etc, etc
...

String html = controller.render(modelAndView);
...
render in iText to a PDF
...

Flying Saucer + iText を使用してマークアップを既にレンダリングできます。コントローラーの出力を文字列にキャプチャするのにかなりの時間を費やしています。何かご意見は?最初に文字列にレンダリングしないことにオープンです。最終結果は、電子メールに添付できる PDF である必要があり、レンダリングしている JSP にデータを動的に追加できる必要があります。

4

3 に答える 3

2

ビューテクノロジとしてjspを使用していると想定しています。その場合、レンダリングはSpringによって制御されませんが、レンダリングされるコンテナにディスパッチされます(dispatcher.forward(request, response))。あなたが見つけているように、コントローラー層で応答をインターセプトする方法があるかどうかは疑問です。別の方法として、このアプローチをお勧めします。

  1. FreemarkerStringtemplateなどのテンプレートエンジンを使用してhtmlを生成します。これにより、SpringMVCとは関係なく必要な特定のhtmlを生成できます。

  2. 上で生成されたhtmlを使用して、iText /FlyingSaucerで実行してpdfを生成します。

編集

もう少し考えてみると、実行可能な別のアプローチは、特定のコントローラー要求マッピングへの要求をインターセプトするサーブレットフィルターを作成することです。このフィルターは、html応答をインターセプトし、itexを使用してpdfに変換し、pdfをストリーミングします。

于 2013-01-04T00:46:23.207 に答える
2

@Biju Kunjummen が既に言ったように、レンダリングはコントローラーではなくビューで行われます。コントローラーはモデルを準備するだけで、ビューはモデル データを静的コンテンツに追加してレンダリングします。

SpringMVC のデフォルトのビュー テクノロジーは JSP です。PDF は別のビュー テクノロジと見なすことができ、SpringMVC にはビューに PDF を使用するための規定が既にあります。JSP ビューに転送するのではなく、PDF ビューに転送します。

Spring のAbstractPDFViewを見て、このチュートリアルをチェックしてください: http://numberformat.wordpress.com/2009/07/20/spring-mvc-with-pdf-output/。残念ながら、このチュートリアルでは手動で PDF を作成しますがbuildPDFDocument、これはまさにあなたが望むものではありません。チュートリアルを拡張する必要があります

  • renderMergedOutputModelメソッドで JSP を HTML にレンダリングする
  • Flying Saucer を使用して HTML + CSS を取得し、buildPDFDocumentメソッド内で PDF にします。

renderMergedOutputModelメソッドのJavaDocにあるように

最初のステップはリクエストの準備です。JSP の場合、これはモデル オブジェクトをリクエスト属性として設定することを意味します。2 番目のステップは、ビューの実際のレンダリングです。たとえば、RequestDispatcher を介して JSP を含めます。

コードは次のようになります。

RequestDispatcher rd = request.getRequestDispatcher("some.jsp"); request.setAttribute("anotherString", model.getValue());
rd.forward(リクエスト、レスポンス);

ただし、トリックがあります。サーブレットの応答にレンダリングするのではなく、ラッパーを使用して別の ByteArrayOutputStream にレンダリングする必要があります。Flying Saucer へのByteArrayOutputStream入力として使用できます。ここでラッパーのソリューションを確認してください: Tomcat/Websphere を使用した文字列またはメモリ バイト配列への JSP コンパイル

このbuildPDFDocumentメソッドでは、レンダリングされた HTML を Wrapper から ByteArrayOutputStream の形式で取得し、それを使用して Flying Saucer で PDF をレンダリングします。

于 2013-01-04T07:22:06.083 に答える