2013-07-17 168 views
1

我一直在尋找解決這個問題的日子。在網站中打印PDF

描述:我有一個網站,通過iFrame動態加載PDF。 PDF保存在服務器上,網站用戶可以在網站上查看PDF。

問題:在網站上引入一個打印按鈕,打印動態創建並保存在服務器上的PDF。

這甚至可能嗎?我正在研究跨瀏覽器的實現,以使事情變得更糟。我已經嘗試過從網絡上獲得n個JS選項,但它們都沒有工作。我似乎無法以與看起來相同的方式打印PDF。簡而言之,我試圖模擬加載時出現在PDF上的打印按鈕。是否有一個選項可以將PDF文檔從服務器傳遞到打印對話框?

+0

如果您已將pdf保存在服務器上,並且看起來像您想要的那樣,您可以提供一個定期鏈接,它將使用戶閱讀pdf。從那裏打印它會很容易。然而,如果你希望「點擊一下並從打印機出來」的解決方案,壞消息是沒有一個。相關:http://stackoverflow.com/questions/5627035/how-to-print-the-contents-of-an-external-file-in-php – lostphilosopher

+0

我假設你已經確定這(http: //www.javascriptkit.com/howto/newtech2.shtml)不適合你? – lostphilosopher

+0

>是否有將PDF文檔從服務器傳遞到打印對話框的選項? ......當然不是,只要你希望其他人能夠盲目地將東西發送到你的機器上並做一些事情。 –

回答

1

我不確定這是否可行,但您可以嘗試啓動一個帶有special version of your PDF file that opens the print dialog when opened的彈出窗口。然後關閉彈出窗口。這最後一部分可能會非常棘手,因爲我認爲沒有辦法知道打印對話框是否已關閉。

+0

謝謝你。我最終做了類似的事情。 –

+0

注意:我發現幾乎不可能顯示嵌入在網頁內的iFrame中的PDF的打印對話框。我的解決方案是打開另一個只包含PDF的窗口,當用戶點擊'打印'按鈕時。以下鏈接幫助 - http:// stackoverflow。com/questions/270674/print-pdf-from-asp-net-without-preview –

+0

@steve mais,也許你應該爲你自己的問題寫一個新的答案,並說明你所做的所有細節。它可以幫助其他人面臨同樣的問題。 – yms

2

描述:我有一個網站,通過iFrame動態加載PDF。 PDF保存在服務器上,網站用戶可以在網站上查看PDF。

問題:在網站上引入一個打印按鈕,打印動態創建並保存在服務器上的PDF。

解決方案:我找不到這個問題的精確解,但這裏是我是如何解決這個問題 -

  1. 創建「打印」按REQ和重定向到具有唯一的另一頁PDF。
  2. 複製上一頁PDF &使用JS創建新的PDF - this.print(),當打開時,打印對話框直接彈出給用戶。

在新的頁面 -

if ("Location of PDF " != null) 
     { 
      sPdf = "Location of PDF "; 
      PdfReader pReader = new PdfReader(sPdf); 
      Document document = new Document 
       (pReader.GetPageSizeWithRotation(ApplicationConstants.INDEX_ONE)); 
      int n = pReader.NumberOfPages; 
      FileStream fs = new FileStream 
       ("New PDF location", 
       FileMode.Create, FileAccess.Write); 
      PdfCopy copy = new PdfCopy(document, fs); 
      // Write to pdf 
      document.Open(); 
      for (int i = ApplicationConstants.INDEX_ONE; i <= n; i++) 
      { 
       PdfImportedPage page = copy.GetImportedPage(pReader, i); 
       copy.AddPage(page); 
      } 
      copy.AddJavaScript("this.print(true);", true); 
      document.Close(); 
      pReader.Close(); 

      inStr = File.OpenRead("New PDF location"); 
      while ((bytecnt = inStr.Read 
       (buffer, ApplicationConstants.INDEX_ZERO, buffer.Length)) 
       > ApplicationConstants.INDEX_ZERO) 
      { 
       if (Context.Response.IsClientConnected) 
       { 
        Context.Response.ContentType = "application/PDF"; 
        Context.Response.OutputStream.Write(buffer, 
         ApplicationConstants.INDEX_ZERO, buffer.Length); 
        Context.Response.Flush(); 
       } 
      } 
     } 

請注意,我使用iTextSharp的注入JS腳本到新的PDF。希望這可以幫助別人。我試圖找到另一種解決方案,而不使用itextsharp或任何其他DLL,但現在必須做。