2011-08-25 58 views
4

我想頂部使用iTextSharp打開PDF文件,將數據集添加到該文件預先填充數據,然後將其保存到一個流,以便我可以將其顯示給用戶。我不想將它本地保存到文件中。我不斷收到錯誤「無法訪問封閉的流」。我找不出哪個流是錯誤的。iTextSharp文件操作和顯示到FileStreamResults

這是我的代碼:

public FileStreamResult PushDataIntoPDFStream(string filename) 
{  
    var reader = new PdfReader(Path.Combine(Server.MapPath(path), filename)); 
    var xml = @"<?xml version=""1.0"" encoding=""UTF-8""?> 
      <form1> 
      <firstName>test</firstName> 
      <lastName>user</lastName> 
      <driveCar>0</driveCar> 
      <gender>1</gender> 
      <birthdate>2011-08-12</birthdate> 
      <numPets>4</numPets> 
      </form1>"; 

    using (var outstream = new MemoryStream()) 
    { 
      using (var stamper = new PdfStamper(reader, outstream)) 
      { 
       var bytes = System.Text.Encoding.UTF8.GetBytes(xml); 
       using (var ms = new MemoryStream(bytes)) 
       { 
        stamper.AcroFields.Xfa.FillXfaForm(ms); 
       } 
      } 

      return new FileStreamResult(outstream, "application/pdf") 
      { 
       FileDownloadName = "file.pdf"; 
      }; 
    }  
    } 
+0

您是否嘗試過使用''以外的'return'? – Nate

+0

@是的。如果我將它保存到一個文件然後顯示它,我可以使它工作,但我試圖在不保存它的情況下顯示它,到目前爲止沒有組合工作。我有一種不好的感覺,我將不得不保存臨時文件。 –

回答

5

PdfStamper在其內部輸出流.CloseStream屬性;嘗試將其設置爲false:

using (var stamper = new PdfStamper(reader, outstream)) 
{ 
    stamper.Writer.CloseStream = false; 
+1

現貨。這對我有效。但是,如果重新使用流,請不要忘記調用outstream.Seek(0,SeekOrigin.Begin)。 – rod82