You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试CheckForOrderOfFooterTags方法时遇page空引用异常

空引用异常排查:测试PDF页脚标签方法时page为null

我在测试一个检查页脚特定标签显示的方法时,始终抛出System.NullReferenceException: 'Object reference not set to an instance of an object.'异常,定位到是page变量为null导致的。

目标方法

public void CheckForOrderOfFooterTags(PdfDocument pdfDoc, out TagTreePointer autoP, out TagTreePointer posBackup, out TagTreeInfo p)
{
    //  the following logic takes care of changing the order of the footer tags
    //  so that footers appear in the proper order in the tag tree structure
    autoP =pdfDoc.GetTagStructureContext().GetAutoTaggingPointer();
    posBackup =new TagTreePointer(autoP);
    PagesTag.TryGetValue(PageNumber, out p);
    if (p?.TagTreePointer != null)
    {
        //  Make sure that content that will be tagged is placed in tag structure specifically where we need it.
        int indexInParentKidsList = p.TagTreePointer.GetIndexInParentKidsList();
        autoP.MoveToPointer(p.TagTreePointer).MoveToParent();
        //  setting new index only works on taggable items
        if (p.Tagged)
        {
            autoP.SetNextNewKidIndex(indexInParentKidsList + 1);
        }
    }
}

测试代码

public void Check_For_Specific_Tag_Footer_To_Show_Successfully_Called()
{
    var ir = new TestIllustrationReport().Report;
    var reportProperties = new TestDocument().ReportProperties;
    var sec = new FooterSection(new ProductContent(ir));
    sec.Build();
    Dictionary<int, TagTreeInfo> dict = new Dictionary<int, TagTreeInfo>();
    reportProperties.FooterTag=dict;
    FooterEventHandler footerEvent = new FooterEventHandler(sec, reportProperties);

    // Must have write permissions to the path folder
    var path = System.IO.Path.GetTempPath();
    var fileName = System.IO.Path.ChangeExtension("Test", ".pdf");
    var com = System.IO.Path.Combine(path, fileName);

    // pdf
    PdfWriter writer = new PdfWriter(com);
    PdfDocument pdf = new PdfDocument(writer);
    Event headerEvent= new PdfDocumentEvent("pdf", pdf);
    PdfDocumentEvent docEvent = (PdfDocumentEvent)headerEvent;
    iText.Layout.Document document = new iText.Layout.Document(pdf);
    pdf.GetCatalog().SetLang(new PdfString("en-US"));

    // Header and Paragraph
    Paragraph header = new Paragraph(TestData.Header)
 .SetTextAlignment(TextAlignment.CENTER)
 .SetFontSize(20);

    document.Add(header);

    pdf.SetTagged();
    pdf.GetCatalog().SetViewerPreferences(new PdfViewerPreferences().SetDisplayDocTitle(true));

    PdfDocumentInfo info = pdf.GetDocumentInfo();
    info.SetTitle("Testing tags");

    Paragraph p = new Paragraph();
    p.Add("The quick brown ");
    PdfPage page = docEvent.GetPage();

    // Rectangle and canvas
    Rectangle rectangle = new Rectangle(
pdf.GetDefaultPageSize().GetX() + document.GetLeftMargin(),
pdf.GetDefaultPageSize().GetTop() - 80,
page.GetPageSize().GetWidth() - document.GetLeftMargin() - document.GetRightMargin(),
50);
    Div canvas = new Div().SetFixedPosition(pdf.GetPageNumber(page), rectangle.GetLeft(), rectangle.GetBottom(), rectangle.GetWidth());
    Paragraph pFooter = new Paragraph(TestData.Paragraph);
    pFooter.GetAccessibilityProperties().SetRole("H");
    canvas.Add(pFooter);
    document.Add(canvas);

    // Don't close document itself! It would close the PdfDocument!
    document.GetRenderer().Close();

    var pPointer = new TagTreePointer(pdf);
    var pInfo = new TagTreeInfo { Tagged = true };
    // Act 
    footerEvent.CheckForOrderOfFooterTags(pdf, out pPointer, out pPointer, out pInfo);
    document.Close();

    // Assert 
    Assert.NotNull(pdf);

}

异常原因及修复方案

异常根源

测试代码中PdfPage page = docEvent.GetPage();这一行导致page为null。你手动实例化的PdfDocumentEvent并非由iText框架的事件触发机制生成,框架没有为其初始化页面引用,所以调用GetPage()会返回null。

修复步骤

  1. 正确获取页面实例:
    替换手动创建事件获取页面的逻辑,直接从PdfDocument中获取已存在的页面。比如在添加页眉后,文档已经生成第一页,可以用:

    PdfPage page = pdf.GetFirstPage();
    
  2. 修正out参数的变量复用问题:
    测试代码中footerEvent.CheckForOrderOfFooterTags(pdf, out pPointer, out pPointer, out pInfo);重复使用同一个变量接收两个out参数,会覆盖之前的变量值,建议分开声明:

    TagTreePointer autoP = new TagTreePointer(pdf);
    TagTreePointer posBackup = new TagTreePointer(pdf);
    TagTreeInfo pInfo = new TagTreeInfo { Tagged = true };
    footerEvent.CheckForOrderOfFooterTags(pdf, out autoP, out posBackup, out pInfo);
    
  3. 验证PageNumber的有效性:
    目标方法中PagesTag.TryGetValue(PageNumber, out p)依赖PageNumber的值,需要确保FooterEventHandler中的PageNumber对应PDF中存在的页面编号,否则p会为null,后续逻辑也会出现问题。

内容的提问来源于stack exchange,提问作者wonder.glen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 15:51:52