2011-08-25 6 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