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,这样您需要的特定 html 可以独立于 Spring MVC 生成。

  2. 使用上面生成的html通过iText/Flying Saucer运行生成pdf。

编辑

经过一番思考,另一种可行的方法是简单地编写一个 servlet 过滤器来拦截到您的特定控制器请求映射的请求,该过滤器可以拦截 html 响应,使用 itext 转换为 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
  • 用飞碟把HTML+CSS做成PDF的buildPDFDocument方法。

正如该renderMergedOutputModel方法的 JavaDoc 所述

第一步是准备请求:在 JSP 案例中,这意味着将模型对象设置为请求属性。第二步将是视图的实际呈现,例如通过 RequestDispatcher 包含 JSP。

代码应如下所示:

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

但是有一个技巧:我们不想渲染到 servlet 响应,而是使用包装器渲染到单独的 ByteArrayOutputStream。ByteArrayOutputStream可以用作飞碟的输入。在此处检查包装器的解决方案: JSP 编译到字符串或内存字节数组与 Tomcat/Websphere

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

于 2013-01-04T07:22:06.083 回答
0

我找到了一个教程:http ://technologicaloddity.com/2011/10/04/render-and-capture-the-output-of-a-jsp-as-a-string/

它需要spring框架和dwr api。

我还没有测试它,但如果它有效,我将不再需要速度来呈现 HTML 电子邮件模板。

于 2014-11-27T08:34:24.177 回答