2013-01-04 82 views
3

我想一个Spring MVC的控制器呈现为一个字符串创建一个PDF它利用iText。由于应用程序的背后是Oracle访问管理器我不能URL请求的页面的URL和输出保存到一个字符串,我需要做的渲染页面未做另一个HTTP请求。渲染的Spring MVC为String或PDF

我的目标是做类似如下:

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 
... 

我可以用飞碟+ iText的已经呈现的标记,我只是有一个时间捕捉控制器的输出到一个赫克串。有什么想法吗?我开不渲染为String第一,最终的结果只是需要,我可以附加到电子邮件中的PDF,我需要能够动态数据添加到我渲染JSP。

回答

2

我假设您使用jsp作为视图技术 - 如果是这样,渲染不受Spring控制,但被分派到要渲染的容器(dispatcher.forward(request, response))。

  1. 使用模板引擎像Freemarker,或Stringtemplate生成:就像你发现,我如果有拦截在控制器层的反应可言,作为替代,让我推荐这种方法的方式质疑html,这样你就可以独立于Spring MVC生成特定的html。

  2. 使用上面生成的HTML通过iText的/飞碟运行它来生成PDF。

编辑

多一点思考,另一种方法是简单地写一个Servlet过滤器拦截请求的特定控制器的请求映射可行后,该过滤器可以拦截HTML响应,转换到PDF使用itext和流出PDF文件。

2

由于@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,这不正是你想要的。您需要将教程扩展到

  • 渲染一个JSP在renderMergedOutputModel方法
  • 用飞碟把HTML + CSS使它成为在buildPDFDocument方法的PDF为HTML。

作为renderMergedOutputModel方法的JavaDoc规定

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

代码应该是这个样子:

RequestDispatcher的RD =的request.getRequestDispatcher( “some.jsp”); request.setAttribute(“anotherString”,model.getValue());
rd.forward(request,response);

有一招,虽然:我们不希望渲染到servlet响应,而是一个独立的ByteArrayOutputStream使用的包装。可以使用ByteArrayOutputStream作为飞碟的输入。检查这里的包装解决方案: JSP compilation to string or in memory bytearray with Tomcat/Websphere

buildPDFDocument方法,你现在从包装渲染HTML在ByteArrayOutputStream的形式,并用它渲染在飞碟的PDF。