iTextSharp 7对象引用未设置为对象的实例

时间:2016-07-29 16:13:00

标签: itext itext7

是否有建议使用包含段落的单元格来构建表格,以避免在将某些单元格添加到表格或表格到文档时出现异常?我明白这一点,我无法弄清楚会发生什么:

.filled{
  background:#ff9;
}

这是一个使用Windows控制台项目的简单快照(与实际项目相比):

<input>

注意,注释掉了一行代码:

[NullReferenceException: Object reference not set to an instance of an object.]
   iText.Layout.Renderer.TableRenderer.DrawBorders(DrawContext drawContext) +2493
   iText.Layout.Renderer.TableRenderer.DrawChildren(DrawContext drawContext) +1497
   iText.Layout.Renderer.AbstractRenderer.Draw(DrawContext drawContext) +153
   iText.Layout.Renderer.TableRenderer.Draw(DrawContext drawContext) +637
   iText.Layout.Renderer.AbstractRenderer.DrawChildren(DrawContext drawContext) +104
   iText.Layout.Renderer.BlockRenderer.Draw(DrawContext drawContext) +525
   iText.Layout.Renderer.TableRenderer.DrawChildren(DrawContext drawContext) +1382
   iText.Layout.Renderer.AbstractRenderer.Draw(DrawContext drawContext) +153
   iText.Layout.Renderer.TableRenderer.Draw(DrawContext drawContext) +637
   iText.Layout.Renderer.DocumentRenderer.FlushSingleRenderer(IRenderer resultRenderer) +473
   iText.Layout.Renderer.RootRenderer.AddChild(IRenderer renderer) +1999
   iText.Layout.RootElement`1.Add(BlockElement`1 element) +92
   iText.Layout.Document.Add(BlockElement`1 element) +81

添加它可以作为一种解决方法,使文档呈现而没有例外。

1 个答案:

答案 0 :(得分:2)

考虑到OP添加的示例代码,可以轻松复制该问题。

此外,在将代码移植到iText / Java之后,问题也可以在那里重现,参见MikesTableIssue.java测试方法testMikesCode。因此,从Java(原始的iText代码)到C#没有移植错误。

样本甚至可以大大简化并仍然重现问题:

try (   FileOutputStream target = new FileOutputStream("mikesTableIssueSimple.pdf");
        PdfWriter pdfWriter = new PdfWriter(target);
        PdfDocument pdfDocument = new PdfDocument(pdfWriter)    )
{
    Document document = new Document(pdfDocument);
    Table mainTable = new Table(1);
    Cell cell = new Cell()
            .setBorder(Border.NO_BORDER)
            //.setBorderRight(new SolidBorder(Color.BLACK, 0.5f))
            .setBorderTop(new SolidBorder(Color.BLACK, 0.5f));
    cell.add("TESCHTINK");
    mainTable.addCell(cell);
    document.add(mainTable);
}

MikesTableIssue.java test method testSimplified

如果一个

,则不会发生此问题
  • 删除setBorder(Border.NO_BORDER)
  • 删除setBorderTop(new SolidBorder(Color.BLACK, 0.5f))
  • 添加setBorderRight(new SolidBorder(Color.BLACK, 0.5f))

在这种情况下com.itextpdf.layout.renderer.TableRenderer.drawBorders(DrawContext)执行此代码:

if (lastBorder != null) {
    if (verticalBorders.get(j).size() > 0) {
        if (i == 0) {
            x2 += verticalBorders.get(j).get(i).getWidth() / 2;
        } else if(i == horizontalBorders.size() - 1 && verticalBorders.get(j).size() >= i - 1 && verticalBorders.get(j).get(i - 1) != null) {
            x2 += verticalBorders.get(j).get(i - 1).getWidth() / 2;
        }
    }

    lastBorder.drawCellBorder(drawContext.getCanvas(), x1, y1, x2, y1);
}

lastBorderSolidBorder个实例,verticalBorders[[null], [null]]j == 1i == 0

因此,这里应该引入一些额外的null检查。