2011-09-15 31 views
4

我有一個JSF/Seam web應用程序,它有一個頁面,當它被提交(點擊按鈕)時,會導致基於表單輸入動態創建PDF文件(在Java中,服務器端)。目前我的工作是將得到的PDF作爲文件下載返回給瀏覽器,因此用戶可以選擇將其保存或在Acrobat Reader中打開以供後續打印。JSF/Seam:如何在沒有用戶干預的情況下下載和打印動態生成的PDF文件?

我想要做的事情是將PDF發送到瀏覽器並打印(客戶端),而無需用戶進一步干預(當然,除了可能出現的Windows打印機選項對話框,我無法做到這一點) 。

該解決方案似乎基於在加載PDF的頁面上隱藏iframe,然後在iframe上調用.contentWindow.print()。但是,我不知道如何通過HttpServletResponse(使用Java)將PDF導入iframe,更不用說一旦加載pdf後如何自動調用iframe上的print()。

+1

偏題(至少與您的核心問題無關),但您至少可以繞過Chrome> v38的打印對話框。請參閱http:// stackoverflow。com/questions/31643913/how-to-disable-print-preview-on-google-chrome-ver-38(引用由@EnriqueSanMartin發現) – Kukeltje

回答

5

但是,我不知道如何通過獲得PDF到iframe中HttpServletResponse(在Java中)

<iframe src>指向一個servlet URL其獲取PDF的InputStream並將其寫入響應的OutputStream。如有必要,您可以將JSF bean屬性作爲額外的GET參數傳遞,以便您可以控制PDF生成。

<iframe src="pdfServlet?foo=#{bean.foo}&amp;bar=#{bean.bar}"></iframe> 

有問題的Servlet的doGet()方法可以是這樣的:

String foo = request.getParameter("foo"); 
String bar = request.getParameter("bar"); 

response.setContentType("application/pdf"); 

InputStream input = generatePdfSomehowBasedOn(foo, bar); 
OutputStream output = response.getOutputStream(); 
// Now just write input to output. 

少得多如何自動調用的IFRAME打印()一旦PDF一直加載。

掛鉤功能<iframe onload>。但是,您需要考慮瀏覽器的具體行爲。更多提示可以在這個問題上找到:How do I print an IFrame from javascript in Safari/Chrome

0

這不是一個回答你的問題,但你可以使用「信息亭」模式(跳過打印對話框中)看到通過Chrome中的打印對話框:

How to disable print preview on Google Chrome ver 38?

我希望對你有用:)

從回答引用:

的命令行參數--disable-print-preview適用於Chrome的最新版本 ,我剛剛對其進行了測試。

+0

我必須打印一些表單(比如1000+),所以很高興做一些腳本來自動化這個過程,相似的,我認爲所問的問題有一些類似的問題(比如將pdf發送回瀏覽器並觸發打印過程),並且答案(我)太長而無法將其添加到評論中,並且我發佈是因爲閱讀這個問題,我懷疑它不可能自動打印頁面/ doc/pdf(所以爲了澄清這是我的答案) –

+0

_「和答案(我)太長了,不能將它添加到評論中,」 _你可以看到我上面的評論 – Kukeltje

相關問題