2014-06-24 5 views
1

코드에서 단계를 건너 뛴 경우 ItextSharp 버전 5.5.1 및 XML Worker 버전 5.5.1을 사용하고 있는지 확실하지 않습니다. doc.Close는 "문서에 페이지가 없습니다"라는 예외를 throw하지만 sw.toString (HTML 내용 포함)을 보았습니다.손상된/빈 pdf를 반환하는 Itextsharp (XMLWorker)를 사용하여 Asp.net 페이지를 PDF로 변환

private void ExporttoPDF() 
     { 
      HttpContext.Current.Response.Clear(); 
      HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=RequestSummaryReport.pdf"); 
      HttpContext.Current.Response.Charset = ""; 
      HttpContext.Current.Response.ContentType = "application/pdf"; 

      StringWriter sw = new StringWriter(); 
      HtmlTextWriter htw = new HtmlTextWriter(sw);   

      var doc = new Document(PageSize.A3, 45, 5, 5, 5); 
      PdfWriter writer = PdfWriter.GetInstance(doc, Response.OutputStream); 

      doc.Open(); 

      HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
      htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory()); 
      ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false); 

      IPipeline pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, writer))); 

      XMLWorker worker = new XMLWorker(pipeline, true); 
      XMLParser xmlParse = new XMLParser(true, worker); 

      pnlReport.RenderControl(htw); 
      StringReader sr = new StringReader(sw.ToString()); 
      xmlParse.Parse(sr); 
      xmlParse.Flush(); 
      doc.Close(); 
      Response.Write(doc); 
     } 
+0

처음에는보기가 거의 올바른 것처럼 보입니다. 당신은 HTTP 응답 스트림에 직접 쓰고 있으므로'Response.Write (doc);'을 할 필요가 없다. (이 줄은 대부분 사람들이 어쨌든 그것을하는 것으로 간주하지 않는다.) 필자는 ASP.Net 서버가 없어서'StringReader sr = new StringReader ("Hello");로 시도해 보았고 올바르게 작동했습니다. –

답변

0

방금 ​​거의 동일한 증상으로 2 시간을 보냈으며, 결국 문제의 원인을 알아 냈습니다. 나는 당신이 이미 그것을 알아 냈을지도 모른다고 생각하고있다. (질문은 5 개월 전에 질문을 받았다.)하지만 나는 같은 문제에 부딪히는 다른 사람들이있을 경우를 대비하여 대답을 게시 할 것이라고 생각했다.

PdfWriter을 만들면 생성 된 PDF 콘텐츠의 대상이 될 스트림 (귀하의 경우 Response.OutputStream)을 전달합니다. PdfWriter이 스트림에 내용을 쓰면 스트림 위치가 그에 따라 증가합니다. 작성자가 끝나면 스트림 위치가 내용의 끝 부분에 있으며 이는 더 이상 쓰기를위한 모든 호출이 PdfWriter이 중단 된 곳에서 계속되어야하기 때문에 의미가 있습니다.

MVC 파이프 라인에서 Response.OutputStream (메서드가 반환 된 후)을 가져 와서 내용을 클라이언트로 보내거나 (일반적으로 PDF 대상 스트림이 소비 될 때마다) 읽으려고하면 스트림 위치 은 콘텐츠의 끝 부분에 있으며 이는 소비자에게 스트림이 비어 있음을 의미하므로 빈 PDF 출력이 나타납니다.

이 문제를 해결하려면 스트림의 쓰기가 끝나면 즉시 스트림의 위치를 ​​재설정하고 무엇이든 스트림에서 읽기를 시도하기 만하면됩니다. 귀하의 경우 삽입에서 :

Response.OutputStream.Position = 0; 

바로 그 스트림에 기록합니다 마지막 줄이기 때문에, xmlParse.Flush()에 선 후.