2012-02-24 72 views
3

我在Play Framework中發送了一封電子郵件,我想呈現一個PDF文件作爲電子郵件附件。我選擇使用Play Framework PDF模塊,因爲它使用Play常規的Groovy HTML模板系統。如何使用作業異步使用Play Framework PDF模塊呈現PDF?

我可以用下面的代碼顯示PDF文件ByteArrayOutputStream在我的控制器方法:

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

不過,我不喜歡這個主意的PDF渲染擋住了我的請求處理線程。我想在作業中異步渲染PDF。問題是,當我將代碼移到Job中時,我開始得到NullPointerExceptions。這是因爲Play PDF模塊的PDF渲染方法廣泛使用了Controller方法中可用的Session,Request,Params和Flash對象,但在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()); 

有什麼辦法增加會話,請求,則params和Flash的信息是安全地供我PDF的工作嗎?或者我可以以某種方式阻止PDF模塊的渲染方法調用它們?我並不需要模板中的請求和參數信息。

+0

有趣的問題。我將在本週末進行調查。 – 2012-02-24 10:36:22

+0

任何想法@Zenklys? – skrii 2012-03-07 13:43:34

回答

0

PDF需要在控制器中呈現,否則嘗試會讓您頭疼得多。

您可以使用異步編程(請參閱here)。在這個例子中,他們使用生成一個pdf作爲用例:)

+1

我也打算髮布到你已經確定的鏈接,但是這實際上是在工作中生成pdf,並返回一個Promise,所以它並沒有在控制器中實際完成。我認爲文檔中的示例是一個示例用例,而不是使用PDF模塊的可行解決方案。 – Codemwnci 2012-02-24 18:57:04

+0

@Codemwnci是的,你是對的,我沒有注意到這個詞的「工作」部分:( – 2012-02-25 13:51:33

相關問題