当前位置: 首页 > 知识库问答 >
问题:

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

姬银龙
2023-03-14

是否有建议使用具有段落的单元格构建表,以避免在向表或文档添加单元格时出现异常?我明白了,但我不知道会发生什么:

[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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using iText.Layout;
using iText.Layout.Borders;
using iText.Layout.Element;

namespace iTextTest
{
    public static class iTextSharpHelper
    {
        public static T SetBorderEx<T>(this ElementPropertyContainer<T> element, Border border)
           where T : ElementPropertyContainer<T>
        {
            element.SetBorder(border);

            return (T)element;
        }

        public static Paragraph Style(this BlockElement<Paragraph> element)
        {
            element
                .SetBorderEx(iText.Layout.Borders.Border.NO_BORDER)
                .SetFont(iText.Kernel.Font.PdfFontFactory.CreateFont(iText.IO.Font.FontConstants.HELVETICA))
                .SetFontSize(10.0f)
                .SetFixedLeading(12.0f)
                .SetVerticalAlignment(iText.Layout.Properties.VerticalAlignment.BOTTOM)
                .SetMargin(0f);

            return (Paragraph)element;
        }
    }

    class Program
    {
        private static float[] tableColumns = { 0.35f, 0.25f, 0.15f, 0.25f };

        static void Main(string[] args)
        {
            iText.Kernel.Pdf.PdfDocument pdf = new iText.Kernel.Pdf.PdfDocument(new iText.Kernel.Pdf.PdfWriter("test.pdf"));

            iText.Layout.Document document = new iText.Layout.Document(pdf, iText.Kernel.Geom.PageSize.A4);

            document.SetMargins(50f, 50f, 25f, 50f);

            iText.Layout.Element.Table mainTable = new iText.Layout.Element.Table(tableColumns)
                .SetBorderEx(iText.Layout.Borders.Border.NO_BORDER)
                .SetWidthPercent(100)
                .SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.LEFT)
                .SetPadding(0f);

            for (int i = 0; i < 10; i++)
            {
                AddRow(mainTable, "ABCDEFGHIJ", "ABCDEFGHIJ", "ABCDEFGHIJ");
            }

            document.Add(mainTable);

            document.Close();
        }

        private static void AddRow(iText.Layout.Element.Table table, string col1, string col2, string col3)
        {
            // Label
            AddCell(table, col1, true)
                .SetBorderTop(new iText.Layout.Borders.SolidBorder(iText.Kernel.Colors.Color.BLACK, 0.5f));

            // Product - Voucher and price/pcs        
            AddCell(table, col2, true)
                .SetBorderTop(new iText.Layout.Borders.SolidBorder(iText.Kernel.Colors.Color.BLACK, 0.5f));

            // Message
            AddCell(table, col3, true, 2)
                .SetBorderTop(new iText.Layout.Borders.SolidBorder(iText.Kernel.Colors.Color.BLACK, 0.5f))
                //.SetBorderRight(new iText.Layout.Borders.SolidBorder(iText.Kernel.Colors.Color.BLACK, 0.5f))
                .SetHorizontalAlignment(iText.Layout.Properties.HorizontalAlignment.RIGHT)
                .SetTextAlignment(iText.Layout.Properties.TextAlignment.RIGHT);
        }

        private static iText.Layout.Element.Cell AddCell(iText.Layout.Element.Table table, string text, bool setBold = false, int colSpan = 1)
        {
            iText.Layout.Element.Cell cell = new iText.Layout.Element.Cell(1, colSpan)
                .SetBorderEx(iText.Layout.Borders.Border.NO_BORDER)
                .SetVerticalAlignment(iText.Layout.Properties.VerticalAlignment.BOTTOM);

            if (!string.IsNullOrEmpty(text))
            {
            iText.Layout.Element.Paragraph paragraph = new iText.Layout.Element.Paragraph(text)
               .Style();

            if (setBold)
                paragraph.SetBold();

            cell.Add(paragraph);
            }

            table.AddCell(cell);

            return cell;
        }
    }
}

注意,注释的代码行:

//.SetBorderRight(new iText.Layout.Borders.SolidBorder(iText.Kernel.Colors.Color.BLACK, 0.5f))

添加它可以作为一种变通方法,使文档能够毫无例外地呈现。

共有1个答案

齐成双
2023-03-14

鉴于OP添加的示例代码,该问题很容易重现。

此外,在将代码移植到iText/Java之后,这个问题也可以在那里重现,参见MikesTableIssue。java测试方法TestMikeCode。因此,从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测试方法testSimplified

如果有人

  • 删除订单(边框。无边框)或
  • 删除新的SolidBorder(颜色:黑色,0.5f))或
  • 添加setBorderRight(新的SolidBorder(Color.BLACK,0.5f))

在这种情况下,com。itextpdf。布局渲染器。桌面渲染器。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检查。

 类似资料:
  • 我需要将一些html转换为PDF。我遇到了IText7,它看起来是一个很好的解决方案。 我正在. net core 3.1中开发 但是,即使使用它的基本实现,我也会遇到一个错误: 每个人都喜欢这个错误: 对象引用未设置为对象的实例。 内部异常为null,唯一的线索是SerializationStackTraceString是: 在iText. IO. FontCache. cctor() 那么,它

  • 我试图在Windows控制台应用程序中下载azure Blob。当我构建和调试应用程序时,我的azure连接字符串引发了一个异常。这个字符串在我的其他ASP.NET应用程序中工作得很好。

  • 在我的ASP.NET程序中。我设置了一个受保护的列表。我在列表中添加了一个值。但它显示对象引用未设置为对象错误的实例 如何解决这个错误?

  • 创建新的PDF文档时会发生以下情况。在第三页上创建第一个文本字段时出错。前两页上创建了多个字段,没有问题。 相关代码: 插入pdfPage。冲洗();在“PdfPage PdfPage=pdfDoc.AddNewPage(pageSize);”之后语句在将第一个文本框添加到第一页时会导致相同的错误。 如何更正错误?

  • 我有以下C#类: 总而言之,区域设置有区域、按钮和字段。区域有中心和东部。中心和东部拥有产权。Fields包含具有属性firstName、lastName和ChooseLocale的标签。 在一个名为GetLocale的方法中,我有以下代码: 运行代码时,在以下行抛出一个“NullReferenceException was unhandled by user code”: 我设置属性title、

  • 我试图按照iText7文档中的一些内容在我的pdf文档中插入一个标题,但是GetPageSize()返回'Object reference not set to a Object实例‘。 我尝试通过PdfDocument对象和Document对象添加页面,并设置页面大小。我可以在循环中看到4页,但是,我所做的任何更改都不会给我一个页面大小。 错误消息System.NullReferenceExce