测试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。
修复步骤
正确获取页面实例:
替换手动创建事件获取页面的逻辑,直接从PdfDocument中获取已存在的页面。比如在添加页眉后,文档已经生成第一页,可以用:PdfPage page = pdf.GetFirstPage();修正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);验证
PageNumber的有效性:
目标方法中PagesTag.TryGetValue(PageNumber, out p)依赖PageNumber的值,需要确保FooterEventHandler中的PageNumber对应PDF中存在的页面编号,否则p会为null,后续逻辑也会出现问题。
内容的提问来源于stack exchange,提问作者wonder.glen
相关产品推荐
相关产品推荐

