2012-10-24 14 views
0

當我使用iTextSharp的生成PDF文件保存對話框,並將它們保存到磁盤是這樣的:基於http://www.mazsoft.com/blog/post/2008/04/30/Code-sample-for-using-iTextSharp-PDF-library.aspxiTextSharp的生成PDF文件會導致關閉

我打開任何PDF文件我

 Document document = new Document(PageSize.LETTER, 50, 50, 80, 50); 
     FileStream fs = new FileStream(Ruta, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 
     PdfWriter PDFWriter = PdfWriter.GetInstance(document, fs); 

     EsquemaFormato PageEventHandler = new EsquemaFormato(); 
     PageEventHandler.Title = TitleMiddle; 
     PageEventHandler.TitleHeaderFont = FontFactory.GetFont(BaseFont.HELVETICA, 12, Font.NORMAL); 
     PageEventHandler.TitleRightHeaderFont = FontFactory.GetFont(BaseFont.HELVETICA, 9, Font.NORMAL); 
     PageEventHandler.HeaderLeft = "Nombre"; 
     PageEventHandler.HeaderRight = TitleRight; 
     PageEventHandler.RutaImagen = RutaImagen; 
     PageEventHandler.Cuerpo = Cuerpo; 
     PDFWriter.PageEvent = PageEventHandler; 

     document.Open(); 
     document.Close(); 

剛創建,但是當我嘗試關閉它會導致「你想保存嗎?」對話框出現。對於不是用iTextSharp生成的PDF不會發生這種情況。

我錯過了什麼?我已經看到使用Response的解決方案,但我不使用它。 在此先感謝。

更新: 下面是一個簡單http://dl.dropbox.com/u/4582874/test.pdf

編輯: 通過以下布魯諾的鏈接我發現這個職位:iTextSharp + FileStream = Corrupt PDF file

這奏效了! 這是我工作的代碼現在:

public void CreatePDF(string TitleMiddle, string Ruta, string RutaImagen, string TitleRight, string Cuerpo) 
    { 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      Document document = new Document(PageSize.LETTER, 50, 50, 80, 50); 
      PdfWriter PDFWriter = PdfWriter.GetInstance(document, ms); 

      EsquemaFormato PageEventHandler = new EsquemaFormato(); 
      PageEventHandler.Title = TitleMiddle; 
      PageEventHandler.TitleHeaderFont = FontFactory.GetFont(BaseFont.HELVETICA, 12, Font.NORMAL); 
      PageEventHandler.TitleRightHeaderFont = FontFactory.GetFont(BaseFont.HELVETICA, 9, Font.NORMAL); 
      PageEventHandler.HeaderLeft = "Nombre"; 
      PageEventHandler.HeaderRight = TitleRight; 
      PageEventHandler.RutaImagen = RutaImagen; 
      PageEventHandler.Cuerpo = Cuerpo; 
      PDFWriter.PageEvent = PageEventHandler; 

      document.Open(); 
      document.Close(); 
      byte[] content = ms.ToArray(); 
      using (FileStream fs = File.Create(Ruta)) 
      { 
       fs.Write(content, 0, (int)content.Length); 
      } 
     } 
    } 
+0

您還可以發佈您的代碼生成的樣本pdf進一步檢查嗎? – mkl

+0

複製與http://stackoverflow.com/questions/12569475/using-itextsharp-to-write-data-to-pdf-works-great-but-acrobat-reader-asks-do-y/12586773 –

+0

布魯諾,我'm沒有使用GetBuffer() – rvidaurric

回答

0

您是否嘗試過它沒有FileAccess.ReadWrite,FileShare.ReadWrite屬性?

我使用itextSharp每天創建PDF,並且從未遇到過這個問題 - 你的代碼和我的主要區別是我沒有這些。

我懷疑FileShare將文件稍微打開,等待某人完成關閉並保存?

+0

FileStream fs = new FileStream(Ruta,FileMode.OpenOrCreate); //我也遇到了同樣的問題 – rvidaurric

+0

也關閉了你的文件流。或者用你的GetInstance創建新的文件流。 PdfWriter.GetInstance(文檔,新的FileStream(Ruta,FileMode.OpenOrCreate)); – Darren

+0

它也工作了(我已經編輯了我的文章與另一種解決方案),謝謝! – rvidaurric