2009-08-03 70 views
3

我見過像這樣圍繞這麼幾個問題,但找不到任何最適合我的。我想發生的一連串事件如下:如何從代碼隱藏頁面打印現有PDF?

  1. 用戶點擊ASP.NET按鈕控制
  2. 此觸發該按鈕的onclick事件,這是一個函數foo()在C#代碼隱藏
  3. FOO()調用其他一些(不重要)函數創建這最終保存到服務器上的磁盤上的PDF。一旦生成PDF該函數返回的路徑,PDF
  4. 沒有任何其他用戶交互,打印對話框中的用戶的瀏覽器打開打印PDF

什麼我需要做什麼來完成步驟4?理想情況下,它會是這樣,我可以在foo中調用(),傳遞路徑PDF,將觸發在用戶的瀏覽器的打印對話框(打印PDF,而不是頁面的從其中的onclick解僱)。

我認爲我可以轉發到PDF文檔的URL,並在PDF中嵌入一些自動打印它的Javascript,但我寧願不 - 我不一定要打印PDF它打開的時間(在瀏覽器中)。任何其他好的方法來做到這一點?

回答

0

我到達的解決方案是這樣的:

創建一個新的ASP.NET Web窗體(我叫雷爲BinaryData.aspx)作爲對PDF的佔位符。在後面的代碼,唯一的方法應該是Page_Load中,它看起來像:

protected void Page_Load(object sender, System.EventArgs e) 
{ 
    //Set the appropriate ContentType. 
    Response.ContentType = "Application/pdf"; 
    Response.AppendHeader("Pragma", "no-cache"); 
    Response.AppendHeader("Cache-Control", "no-cache"); 
    //Get the physical path to the file. 
    string FilePath = (string)Session["fileLocation"]; 
    if (FilePath != null)   
    { 
     string FileName = Path.GetFileName(FilePath); 

     Response.AppendHeader("Content-Disposition", "attachment; filename="+FileName); 

     //Write the file directly to the HTTP content output stream. 
     Response.WriteFile(FilePath); 
     Response.End(); 
    } 
} 

的PDF在頁面通過名爲「fileLocation」會話變量傳遞。所以,我必須設置該變量,然後致電Response.Redirect("BinaryData.aspx")

它不會自動打印,但會觸發下載PDF而不離開當前頁面(這對我來說已經足夠了)。

0

我沒有嘗試這一點,但它是一個想法:

如果你的查詢字符串中嵌入PDF JavaScript的參數,然後嵌入的JavaScript,使打印功能是在JavaScript參數條件。

這樣一來,如果你重定向到,例如,yourpdf.pdf?打印,將打印,並且如果它沒有打印參數打開,它表現爲任何其他正常的PDF會做。

+0

這聽起來像它將會在更加複雜的方向 - 它當然可以工作,但我寧願保持獨立的PDF網頁的行爲。 – 2009-08-03 17:33:40

0

如果你想下去,只要打開它打印出來的路徑:

還有就是你能儘快插入,迫使它來打開打印對話框中的PDF作爲一個標誌PDF已打開。我這樣做是很久以前使用傳統的ASP的abcpdf組件,代碼看起來是這樣的:

Set oDoc = Server.CreateObject("ABCpdf4.Doc") 
oDoc.SetInfo oDoc.Root, "/OpenAction", "<< /Type /Action /S /Named /N /Print >>" 

顯然,代碼將取決於哪個PDF創建工具,使用的是不同的看...

+0

我是否會告訴用戶的瀏覽器在通過調用Response.Redirect(「[url to PDF]」)生成後打開PDF? – 2009-08-03 18:48:26

+0

是的,或者您可以響應.writefile並設置頁面的所有Response.ContentType和其他標題以提供PDF。 – Vdex 2009-08-03 19:55:20

1
Response.Clear() 
Response.AddHeader("Content-Disposition", "attachment; filename=myfilename.pdf") 
Response.ContentType = "application/pdf" 
Response.BinaryWrite(ms.ToArray()) 

其中Ms =包含文件一個MemoryStream(您不必將其寫入到磁盤之間)。

否則,如果你絕對要對付從硬盤,使用未來:

Response.WriteFile("c:\pathtofile.pdf") 
1

感謝您的回答Vdex。這裏是iText/C#版本。

PdfAction action = new PdfAction(); 
action.Put(new PdfName("Type"), new PdfName("Action")); 
action.Put(new PdfName("S"), new PdfName("Named")); 
action.Put(new PdfName("N"), new PdfName("Print")); 

PdfReader reader = new PdfReader(ReportFile.FullFilePath(reportFile.FilePath)); 

PdfStamper stamper = new PdfStamper(reader, Response.OutputStream); 
stamper.Writer.CloseStream = false; 
stamper.Writer.SetOpenAction(action); 
stamper.Close();