【问题标题】:How to render PDFs with Play Framework PDF module asynchronously using Jobs?如何使用 Jobs 异步渲染带有 Play Framework PDF 模块的 PDF?
【发布时间】:2012-02-24 23:28:48
【问题描述】:

我正在 Play Framework 中发送一封电子邮件,我想渲染一个 PDF 文件以用作电子邮件附件。我选择使用 Play Framework PDF 模块,因为它使用 Play 的常规 Groovy HTML 模板系统。

我可以使用以下代码在我的 Controller 方法中将 PDF 文件渲染到 ByteArrayOutputStream:

PDF.MultiPDFDocuments docs = new PDF.MultiPDFDocuments("myfile.pdf);
ByteArrayOutputStream os = new ByteArrayOutputStream();
MyEntity myArgument;
PDF.writePDF(os, docs, myArgument);

但是,我不喜欢 PDF 呈现阻塞我的请求处理线程的想法。我想在 Job 中异步渲染 PDF。问题是当我在 Job 中移动我的代码时,我开始得到 NullPointerExceptions。这是因为 Play PDF 模块的 PDF 渲染方法广泛使用了 Session、Request、Params 和 Flash 对象,这些对象在 Controller 方法中可用,但在 Job 中不可用。例如方法 play.modules.pdf.PDF.renderTemplateAsPDF 有以下几行:

templateBinding.put("session", Scope.Session.current());
templateBinding.put("request", Http.Request.current());
templateBinding.put("flash", Scope.Flash.current());
templateBinding.put("params", Scope.Params.current());

是否有任何方法可以添加会话、请求、参数和 Flash 信息以安全地用于我的 PDF 作业?或者我可以以某种方式阻止 PDF 模块的渲染方法调用它们吗?我真的不需要模板中的 Request 和 Params 信息。

【问题讨论】:

  • 有趣的问题。这个周末我会调查一下。

标签: playframework


【解决方案1】:

PDF 需要在控制器中呈现,否则会令您头疼。

您可以使用异步编程(请参阅here)。在示例中,他们使用生成 pdf 作为用例:)

【讨论】:

  • 我也打算发布到您确定的链接,但这实际上会在工作中生成 pdf,并返回一个 Promise,因此它实际上并没有在控制器中完成。我认为文档中的示例是一个示例用例,而不是使用 PDF 模块的可行解决方案。
  • @Codemwnci 是的,你是对的,我没有注意这个词的“工作”部分:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2013-12-26
相关资源
最近更新 更多