2013-02-19 112 views
1

我想在使用iTextSharp的MVC中創建一個PDF文件。我有一個簡單的使用案例。文件正在創建,但是當我打開PDF時,我得到錯誤文件已損壞無法打開文件。任何想法/幫助?iTextSharp在內存中創建文件導致損壞的文件

我的控制器代碼是如下

public FileStreamResult GetPdfMemory() 
{ 
      iTextSharp.text.Document doc = new iTextSharp.text.Document(); 


      MemoryStream mem = new MemoryStream(); 
      PdfWriter pdfWriter = PdfWriter.GetInstance(doc, mem); 
      //pdfWriter.CloseStream = false; 

      doc.Open(); 
      doc.Add(new Paragraph("Charts")); 


      mem.Position = 0; 

      FileStreamResult fileStreamResult = new FileStreamResult(mem, System.Net.Mime.MediaTypeNames.Application.Pdf) 
      { 
       FileDownloadName = "chart_" + ".PDF" 
      }; 

      return fileStreamResult; 
} 

查看: @ Html.ActionLink( 「全文記憶」, 「GetPdfMemory」, 「家」,空,新的{ID = 「下載」})

僅供參考:當我嘗試使用FileStream而不是MemoryStream時,所有工作都正常。但我需要使用內存流創建PDF。

回答

0

您在信號iTextSharp之前操縱(mem.Position = 0)並使用(new FileStreamResult(mem, ...)MemoryStream它可以最終確定文檔。因此,取決於對DocumentPdfWriter的隱式銷燬或對存儲器流中數據的使用是否首先出現,您可能會因PDF丟失其關閉部分或關閉部分(在重新定位存儲器流後寫入)覆蓋數據的開始。

爲了告知iTextSharp的,它可以完成該文檔,請撥打doc.Close()操縱存儲器流之前或者可選地使用Documentusing塊,例如:

using (MemoryStream ms = new MemoryStream()) { 
    // step 1 
    using (Document document = new Document()) { 
    // step 2 
    PdfWriter.GetInstance(document, ms); 
    // step 3 
    document.Open(); 
    // step 4 
    document.Add(new Paragraph("HelloWorldMemory"));  
    } 
    HttpContext.Current.Response.BinaryWrite(ms.ToArray()); 
} 

(無恥地從樣品HelloWorldMemory.cs複製從Webified iTextSharp Examples),用於iText in Action — 2nd Edition

使用using隱含地使Document被關閉。

+0

在MVC中,當將FileStreamResult作爲操作結果返回時,我們不能使用using子句。我們將始終得到「無法接近關閉」錯誤。僅供參考,我在.NET MVC中嘗試了這一點。 – Think 2013-02-20 16:33:07

+0

在這種情況下,請在答案中嘗試其他選擇。 – mkl 2013-02-20 19:42:35

+0

這是我發佈在我原來的問題,除非你指的是一些其他的選擇。 – Think 2013-02-20 20:01:26