【问题标题】:ItextSharp nested table on multiple pages causes NullReferenceException多个页面上的 ItextSharp 嵌套表导致 NullReferenceException
【发布时间】:2011-01-13 05:18:23
【问题描述】:

执行以下代码时,我收到 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>

【问题讨论】:

  • 您在哪一行得到异常?
  • doc.Add(GenerateNestedTableTest());

标签: c# asp.net pdf-generation itextsharp nullreferenceexception


【解决方案1】:

经过一段时间的挣扎,我终于确定这是图书馆的一个缺陷。我去看看有没有更新的版本。事实上有。我使用的是 4.1.6 版。现在有一个版本 5.0.0。此代码在该版本中正确运行。

在我替换了 dll 之后,我还添加了

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

紧接着

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

修复嵌套表在新页面上的问题。现在一切似乎都很好。也许这篇文章会对使用旧版本的其他人有所帮助。

【讨论】:

  • FWIW,我将您的代码复制到测试项目中的代码后面,但没有收到错误。我使用的是旧版本的库(我认为是 4.0.3)。很高兴你成功了。
  • 我们最近在 4.1.6 上也遇到了同样的问题。尝试了最新的 5.5.9 并没有在那里发生。但是,> 4.1.6 上的许可证是这样的,您必须提供源代码或购买价值超过 2,400 美元(目前)的商业许可证。
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多