2016-05-09 81 views
2

我得到「無法加載PDF文檔」在Chrome和「文件已損壞且無法修復」在IE瀏覽器的一些文件。錯誤,同時打開PDF

的代碼如下:

PDFSteramer:

if (pdf != null) 
{ 
    Response.ContentType = "application/PDF"; 
    Response.AddHeader("Content-Type", "application/pdf"); 
    Response.AddHeader("Content-Disposition", "inline"); 

    pdf.Renderer.Render(pdf, Response.OutputStream); 

    Response.Flush(); 
} 

而在渲染類:

using (FileStream fs = new FileStream(this._ParentDocument.Document.FullName, FileMode.Open, FileAccess.Read)) 
{             
    byte[] buffer = new byte[bufferSize]; 

    fs.Read(buffer, 0, bufferSize); 

    using (StringReader reader = new StringReader(System.Text.ASCIIEncoding.ASCII.GetString(buffer))) 
    {       
     Decoder decoder = new UuDecoder(stream, ""); 

     string data; 

     while ((data = reader.ReadLine()) != null) 
     { 
      decoder.DecodeLine(data); 
     } 
    } 
} 

和DecodeLine是如下:

public override bool DecodeLine(string line) 
{ 
    try 
    {                
     byte[] data = Encoding.UTF8.GetBytes(line); 
     //byte[] data = uuDecode(line); 

     outStream.Write(data, 0, data.Length);     
    } 
    catch (Exception ex) 
    { 
    } 
    return false; 
}  

以下就是它在F中拋出的東西irefox:

enter image description here

而且在Adobe閱讀器:

enter image description here

+2

不確定你可以讀取pdf文件作爲文本文件(即從它讀取字符串,而不是讀取它的二進制文件),但如果這是正確的,使用ASCII編碼讀取然後用UTF8解碼聽起來很糟糕。你爲什麼不簡單地返回你閱讀的二進制文件內容? –

+0

的任何鏈接? @GianPaolo – Neel

+1

這應該只是作爲二進制傳輸,而不是文本。不知道你爲什麼要把它轉換成任何東西。只需設置ContentLength,將pdf讀爲字節並將這些字節轉儲到流中。 – Nyerguds

回答

2

如果你的PDF存儲在一個物理文件,你並不需要在所有使用中介流,只需使用TransmitFile method其中也有不使用.NET內存的好處(在大多數情況下):

Response.AddHeader("Content-Type", "application/pdf"); 
    Response.AddHeader("Content-Disposition", "inline"); 
    Response.TransmitFile(your pdf path); 
+0

實際上它不是確切的PDF文件。它是我們從中提取PDF文件的SGML文件。我仍然可以使用這個? – Neel

+1

你有一個完整的物理PDFsomewhere嗎?或者你可以建立一個? –

+0

PDF不存儲在任何地方。它是一個SGML文件,我們從中逐行取出一些數據,並從中創建PDF。它現在有意義嗎? – Neel

0

相反與SGML中的META數據一起工作,是否可以將其直接呈現爲PDF?將HTML直接轉換爲PDF非常容易,而不是試圖拉取隨機數據,並希望它仍然有效。你能告訴我們什麼SGML文件?可以幫助每個人都瞭解你想要達成的目標。

0

我對圖像有同樣的問題,經過一段時間後,我通過將編碼(在您的例子Encoding.UTF8)更改爲ASCII()來得到它的工作。試試看。我不保證成功,但絕對值得一試。

它可以幫助你的另一個原因是你顯然使用了兩種不同的編碼,在你編寫System.Text.ASCIIEncoding.ASCII.GetString(buffer)的Render類中,而後來使用UTF-8編碼。