2013-06-18 3 views
0

aspx 페이지를 pdf로 내보내려고합니다. 나는 Button2_Click에이 코드를 사용하고,하지만 난 htmlworker.Parse (STR)에 System.NullReferenceException을 ;: 당신이 Response.OutputStream에 직접 쓸 수 있지만, 이렇게하면 가끔 오류를 마스크 할 수Itextsharp에서 pdf로 내보내기 NullReferenceException

string attachment = "attachment; filename=Article.pdf"; 

Response.ClearContent(); 
Response.AddHeader("content-disposition", attachment); 
Response.ContentType = "application/pdf"; 

StringWriter stw = new StringWriter(); 
HtmlTextWriter htextw = new HtmlTextWriter(stw); 
dvText.RenderControl(htextw); 
Document document = new Document(); 
PdfWriter.GetInstance(document, Response.OutputStream); 

document.Open(); 
StringReader str = new StringReader(stw.ToString()); 
HTMLWorker htmlworker = new HTMLWorker(document); 
htmlworker.Parse(str); 
document.Close(); 

Response.Write(document); 
Response.End(); 
+0

너무 나쁩니다. 디버거를 시작하고 (아마도 F5 키를 눌러서) 범인을 찾고 싶을 수도 있습니다. 귀하의 변수 중 하나는 null이며 그렇게해서는 안됩니다. – nvoigt

답변

1

. 대신 FileStream 또는 MemoryStream과 같은 다른 스트림에 쓰는 것이 좋습니다. 후자를 사용하면 함수간에 전달할 수있는 바이트 배열에 MemoryStream을 유지할 수도 있습니다. 아래의 코드는 일회용 객체에 dispose 패턴을 사용하는 것과 마찬가지로 이것을 보여줍니다.

//We'll use this byte array as an intermediary later 
Byte[] bytes; 

//Basic setup for iTextSharp to write to a MemoryStream, nothing special 
using (var ms = new MemoryStream()) { 
    using (var document = new Document()) { 
     using (var writer = PdfWriter.GetInstance(document, ms)) { 
      document.Open(); 

      //Create our HTML worker (deprecated by the way) 
      HTMLWorker htmlworker = new HTMLWorker(document); 

      //Render our control 
      using (var stw = new StringWriter()) { 
       using (var htextw = new HtmlTextWriter(stw)) { 
        GridView1.RenderControl(htextw); 
       } 
       using (var str = new StringReader(stw.ToString())) { 
        htmlworker.Parse(str); 
       } 
      } 

      //Close the PDF 
      document.Close(); 
     } 
    } 
    //Get the raw bytes of the PDF 
    bytes = ms.ToArray(); 
} 

//At this point all PDF work is complete and we only have to deal with the raw bytes themselves 
string attachment = "attachment; filename=Article.pdf"; 
Response.ClearContent(); 
Response.AddHeader("content-disposition", attachment); 
Response.ContentType = "application/pdf"; 
Response.BinaryWrite(bytes); 
Response.End(); 

위의 내용은 사용자가 컨트롤을 렌더링하는 방법에 따라 여전히 손상 될 수 있습니다. 당신은 페이지의 VerifyRenderingInServerForm 방법을 재정 의하여이 문제를 얻을 수 있습니다

Control 'xxx' of type 'yyy' must be placed inside a form tag with runat=server 

: 당신은 같은 메시지가 말하는 무언가를받을 수 있습니다.

public override void VerifyRenderingInServerForm(Control control) { 
} 
1

HTML에 <hr> 태그가 포함되어 있습니까? HTMLworker에서는 지원되지 않습니다.

0

비슷한 문제가 있습니다. HTMLWorker에 HTMLTagProcessors를 제공하면이 문제가 해결된다는 것을 알게되었습니다.

HTMLWorker htmlworker = new HTMLWorker(document, new HTMLTagProcessors(), null); 

이제 일부 HTML 태그는 HTMLWorker에서 지원됩니다.