2015-08-31 47 views
2

我的目標是從內存流中顯示html-<object>中的PDF。如何將pdf內存流式傳輸到HTML對象

從C#代碼背後我可以從內存流在這樣的瀏覽器顯示獲得PDF,這將有效地隱蔽了整個瀏覽器PDF閱讀器(不理想),因爲我失去了我的應用控制等。我想保持應用程序的覺得一切是裏面一個形式:

MyWeb.Service.Retrieve.GetPdfById r = new MyWeb.Service.Retrieve.GetPdfById(); 

      MemoryStream byteStream = new MemoryStream(r.Execute("705")); 
      Response.Clear(); 
      Response.ContentType = "application/pdf"; 
      Response.AddHeader("content-disposition", "inline; filename=dummy.pdf"); 
      Response.AddHeader("content-length", byteStream.Length.ToString()); 
      Response.BinaryWrite(byteStream.ToArray()); 
      Response.End(); 

在HTML中我可以得到一個PDF到<object>這樣中顯示,這意味着我可以在<div>理想顯示它但它不是來自動態生成的內存流:

<object data="PDF_File/myFile.pdf" type="application/pdf" width="800px"height="600px"> 
     alt : <a href="PDF_File/myFile.pdf">TAG.pdf</a> 
    </object> 

那麼請如何讓內存流進入HTML-<object>

回答

2

對象標記的data屬性應包含一個指向將提供PDF字節流的端點的URL。

爲了使該頁面正常工作,您需要添加一個額外的handler,以提供字節流,例如, GetPdf.ashx。處理程序的ProcessRequest方法將準備PDF字節流並在響應中以內聯方式返回,並在前面加上適當的標題,指示它是PDF對象。

protected void ProcessRequest(HttpContext context) 
{ 
    byte[] pdfBytes = GetPdfBytes(); //This is where you should be calling the appropriate APIs to get the PDF as a stream of bytes 
    var response = context.Response; 
    response.ClearContent(); 
    response.ContentType = "application/pdf"; 
    response.AddHeader("Content-Disposition", "inline"); 
    response.AddHeader("Content-Length", pdfBytes.Length.ToString()); 
    response.BinaryWrite(pdfBytes); 
    response.End(); 
} 

用指向處理程序的URL填充數據屬性,例如, "GetPdf.ashx"

+0

嗨。謝謝。我發現答案(後我張貼)在[鏈接] http://stackoverflow.com/questions/32309235/how-to-memory-stream-a-pdf-to-a-html-object/323​​09563#32309563 [鏈接]但是有一些關於加載順序的問題。我的GetPdfBytes()函數的版本可以在後面的default.cs代碼中工作,但它不能用於GeneralHandler。所以在這種情況下,我還不能確認任何成功。 :/ –

0

你可以嘗試以下方法:

  1. Stream PDF as inline PDF inside iframe但這種強加的大小限制在IE瀏覽器不工作,因爲安全問題,舊的瀏覽器。
  2. 使用PDFObject.js嵌入PDF作爲成HTML頁面(以及可選的它指向的鏈接,從服務器獲取動態生成的PDF)
相關問題