1

다음 코드가 실행될 때 NullReferenceException이 발생합니다. 또한 주 테이블에 셀을 작성한 코드를 추가 할 때 중첩 테이블이 새 페이지에 나타났습니다. 주 테이블에 셀을 쓰는 두 개의 루프를 제거하면 발생하지 않습니다.여러 페이지에있는 ItextSharp 중첩 테이블 때문에 NullReferenceException이 발생합니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Main.master" %> 

<%@ Import Namespace="iTextSharp.text" %> 
<%@ Import Namespace="iTextSharp.text.pdf" %> 

<%@ Import Namespace="System.IO" %> 


<script runat="server"> 

protected void Page_Load(object sender, EventArgs e) 
{ 

    Document doc = new Document(PageSize.LETTER); 

    // Here is some stuff needed to put the pdf into the users response stream 
    Response.Clear(); 
    Response.ContentType = "application/pdf"; 
    MemoryStream memoryStream = new MemoryStream(); 

    PdfWriter writer = PdfWriter.GetInstance(doc, memoryStream); 

    writer.CloseStream = false; // This is important, but it may work without it 

    doc.SetMargins(20, 20, 36, 10); 

    // write stuff to the documents 
    doc.Open(); 

    doc.Add(GenerateNestedTableTest()); 


    doc.Close(); 

    // Now that all writing to the document is done lets send it to the user 
    writer.Flush(); 
    Response.OutputStream.Write(memoryStream.GetBuffer(), 0, memoryStream.GetBuffer().Length); 
    Response.OutputStream.Flush(); 
    Response.OutputStream.Close(); 
    Response.End(); 
} 


private PdfPTable GenerateNestedTableTest() 
{ 
    PdfPTable mainTable = new PdfPTable(5); 

    // test adding cells to mainTable in groups of 5 
    for (int i = 0; i <= 5 * 10; ++i) 
    { 
     PdfPCell mainTableCell = new PdfPCell(new Phrase("Test")); 
     mainTable.AddCell(mainTableCell); 
    } 

    PdfPTable nestedTable = new PdfPTable(3); 

    Font TitleFont = new Font(null, 20, Font.BOLD, Color.BLACK); 

    PdfPCell TitleCell = new PdfPCell(new Phrase("This is the header of the nested table", TitleFont)); 
    TitleCell.Colspan = 3; 

    nestedTable.AddCell(TitleCell); 

    string[] headers = new string[] { "Header1", "Header2", "Header3" }; 

    foreach (string header in headers) 
    { 
     PdfPCell HeaderCell = new PdfPCell(new Phrase(header, new Font(null, 14, Font.BOLD, Color.BLUE))); 
     HeaderCell.HorizontalAlignment = Element.ALIGN_CENTER; 
     nestedTable.AddCell(HeaderCell); 
    } 




    for (int i = 0; i <= 3*556; ++i) 
    { 
     nestedTable.AddCell(new Phrase("Test Cell")); 
    } 


    PdfPCell nestedTableCell = new PdfPCell(nestedTable); 
    nestedTableCell.Colspan = 4; 

    mainTable.AddCell(new PdfPCell()); 
    mainTable.AddCell(nestedTableCell); 


    // test adding cells to mainTable in groups of 5 
    for (int i = 0; i <= 5 * 10; ++i) 
    { 
     PdfPCell mainTableCell = new PdfPCell(new Phrase("Test")); 
     mainTable.AddCell(mainTableCell); 
    } 

    return mainTable; 
} 

</script> 

<asp:Content ID="Content1" ContentPlaceHolderID="PageHeadContentPlaceHolder" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="PageTitleContentPlaceHolder" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content3" ContentPlaceHolderID="PageBodyContentPlaceHolder" Runat="Server"> 
</asp:Content> 
+0

어떤 줄에서 예외가 발생합니까? –

+0

doc.Add (GenerateNestedTableTest()); – 249076

답변

4

잠시 고생하고 나자 마침내 그것이 라이브러리의 결함이라고 판단했습니다. 나는 새로운 버전이 있는지보고 보러 갔다. 그게 사실 이었어. 나는 버전 4.1.6을 사용하고 있었다. 이제 5.0.0 버전이 있습니다. 이 코드는 해당 버전에서 올바르게 실행됩니다. 나는 DLL을 교체 한 후

는 또한 새로운 페이지에있는 중첩 테이블의 문제를 해결하기 위해 바로

private PdfPTable GenerateNestedTableTest() 
{ 
    PdfPTable mainTable = new PdfPTable(5); 

mainTable.SplitLate = false; 
mainTable.SplitRows = true; 

을 추가했다. 모든 것이 이제는 잘 작동하는 것 같습니다. 아마이 게시물은 구 버전에있는 다른 사람을 도울 것입니다.

+0

FWIW, 코드를 테스트 프로젝트의 코드에 복사했는데 오류가 발생하지 않았습니다. 이전 버전의 라이브러리를 사용하고있었습니다 (4.0.3이라고 생각합니다). 다행 이군. –

+0

우리는 최근 4.1.6에서도이 같은 문제를 안고있었습니다. 최신 5.5.9를 시도했지만 거기에서 발생하지 않습니다. 그러나 4.1.6 이상의 라이센스는 소스 코드를 사용할 수있게하거나> 2,400 달러 이상 (현재)의 상용 라이센스를 구매해야합니다. – HK1