我正在尝试将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
方法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。