我正在尝试将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渲染标记,只是花了一点时间将控制器的输出捕获到String中。有什么想法吗?我愿意不先呈现为String,最终结果只需是可以附加到电子邮件的PDF,并且我需要能够动态地将数据添加到要呈现的JSP中。

最佳答案

正如@Biju Kunjummen已经说过的那样,渲染是在视图中完成的,而不是在控制器中完成的。控制器仅准备模型,视图将模型数据添加到静态内容并进行渲染。

SpringMVC中的默认视图技术是JSP。 PDF可以看作是另一种视图技术,并且SpringMVC已经准备好将PDF用于视图。与其转发到JSP视图,还不如转发到PDF视图。

看看Spring的AbstractPDFView并查看本教程:http://numberformat.wordpress.com/2009/07/20/spring-mvc-with-pdf-output/。不幸的是,本教程使用buildPDFDocument手动创建PDF,这并不是您想要的。您需要将教程扩展到

  • 使用renderMergedOutputModel方法
  • 将JSP呈现为HTML
  • 使用flying saucer将HTML + CSS转换为buildPDFDocument方法中的PDF。

  • renderMergedOutputModel方法的JavaDoc所述

    第一步将准备请求:在JSP情况下,这是
    将意味着将模型对象设置为请求属性。第二
    步骤将是视图的实际渲染,例如,包括
    通过RequestDispatcher实现JSP。

    代码应如下所示:

    RequestDispatcher rd = request.getRequestDispatcher(“some.jsp”);
    request.setAttribute(“anotherString”,model.getValue());
    rd.forward(请求,响应);

    但是,有一个技巧:我们不想呈现到servlet响应,而是使用包装器呈现到单独的ByteArrayOutputStream。 ByteArrayOutputStream可以用作飞碟的输入。在此处检查包装器的解决方案:
    JSP compilation to string or in memory bytearray with Tomcat/Websphere

    buildPDFDocument方法中,您现在以ByteArrayOutputStream的形式从包装器中获取了呈现的HTML,并使用它在Flying Saucer中呈现了PDF。

    10-04 22:45
    查看更多