2013-06-24 61 views
4

嗨,我有一個大問題。 我有一個來自Wcf服務的byte [] receveid。字節數組表示一個pdf文件。 在Controller中,我想做到這一點:用html5顯示byte []爲pdf

PDFDto pdfDTO = new PDFDTO(); 
pdfDTO.pdfInBytes = pdfInBytes; //the byte array representing pdf 
return PartialView("PopupPDF,pdfDTO); 

在查看我想做到這一點

 <object data="@Model.pdfInBytes" width="900" height="600" type="application/pdf"> </object> 

但似乎uncorrect。 我在所有的互聯網搜索,有很多關於這個問題的帖子,但沒有人完全匹配我的情況。 你有什麼想法嗎?非常感謝!

+0

是否希望用戶將PDF作爲文件下載或將文檔嵌入頁面中? –

+0

嵌入在頁面中的文檔。 (我用td,css等創建了一個不錯的彈出窗口,所以我不想在另一個頁面上顯示pdf)。例如..如果對象數據=「URL到一個鏈接」,它都可以。但是,如果對象數據= @Model.pdfInBytes,頁面爲空 – user2328912

回答

9

我會建議在控制器designed specifically for rendering the PDF data上創建另一個動作。然後,它只是一個你data屬性中引用它的事:

data="@Url.Action("GetPdf", "PDF")" 

我不知道,你可以轉儲DOM中的原始PDF數據沒有擊中某種編碼問題。儘管我從來沒有嘗試過,但你也許可以像圖片一樣做。但是,對於演示的緣故和圖像看起來像:

src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" 

所以,假設同樣可以做它可能看起來像下面這樣:

@{ 
    String base64EncodedPdf = System.Convert.ToBase64String(Model.pdfInBytes); 
} 

@* ... *@ 
<object data="data:application/pdf;base64,@base64EncodedPdf" 
     width="900" height="600" type="application/pdf"></object> 

我還是愛用我原始響應站然後創建一個新的動作。

+1

它不起作用:( – user2328912

+0

@ user2328912:什麼不是?專用操作或使用'data:'? –

+1

'data:applicaiton/pdf ... '在Chrome中工作,但在IE中似乎不受支持。 –

0
protected ActionResult InlineFile(byte[] content, string contentType, string fileDownloadName) 
    { 
     Response.AppendHeader("Content-Disposition", string.Concat("inline; filename=\"", fileDownloadName, "\"")); 
     return File(content, contentType); 
    } 

將此代碼添加到您的基本控制器或控制器本身,並調用此函數在瀏覽器中顯示文件本身。