iText7(7.1.7)HandleEvent测试报错:文档已关闭+空引用异常
问题分析与解决方案
异常原因解析
1. 文档已关闭异常 (iText.Kernel.PdfException)
测试代码中提前调用了document.Close(),这会直接关闭底层的PdfDocument实例。后续调用footerEvent.HandleEvent(eventK)时,操作已关闭的文档必然触发该异常。
2. 页面为空引用异常 (System.NullReferenceException)
手动创建的PdfDocumentEvent未关联任何PDF页面,导致docEvent.GetPage()返回null,后续代码使用page对象时触发空引用错误。
修正后的测试代码
[Fact] public void HandleEvent_Renders_Properly() { 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); bool called = false; // 生成临时PDF路径 var path = System.IO.Path.GetTempPath(); var fileName = System.IO.Path.ChangeExtension("Test", ".pdf"); var com = System.IO.Path.Combine(path, fileName); PdfWriter writer = new PdfWriter(com); PdfDocument pdf = new PdfDocument(writer); iText.Layout.Document document = new iText.Layout.Document(pdf); // 添加文档内容 Paragraph header = new Paragraph("HEADER") .SetTextAlignment(TextAlignment.CENTER) .SetFontSize(20); document.Add(header); pdf.SetTagged(); pdf.GetCatalog().SetViewerPreferences(new PdfViewerPreferences().SetDisplayDocTitle(true)); pdf.GetCatalog().SetLang(new PdfString("en-US")); PdfDocumentInfo info = pdf.GetDocumentInfo(); info.SetTitle("Testing tags"); Paragraph p = new Paragraph("Tested"); p.GetAccessibilityProperties().SetRole("H"); Div divH = new Div().Add(p); Paragraph p2 = new Paragraph("Child H1"); p2.GetAccessibilityProperties().SetRole("H1"); Div divH1 = new Div().Add(p2); divH1.Add(new Paragraph("Testing ChildChild")); divH.Add(divH1); document.Add(divH); // 关键修正1:先获取页面并创建关联页面的事件,不提前关闭文档 PdfPage page = pdf.GetFirstPage(); // 使用页面构造事件,确保Event包含有效页面引用 PdfDocumentEvent eventK = new PdfDocumentEvent(PdfDocumentEvent.END_PAGE, pdf, page); // Act footerEvent.HandleEvent(eventK); // 关键修正2:操作完成后再关闭文档 document.Close(); // Assert Assert.True(called); }
HandleEvent方法的健壮性优化
在HandleEvent中增加空值与状态检查,避免异常:
public void HandleEvent(Event @event) { var docEvent = @event as PdfDocumentEvent; if (docEvent == null) return; var pdfDoc = docEvent.GetDocument(); if (pdfDoc == null || pdfDoc.IsClosed()) return; // 检查文档是否已关闭 var page = docEvent.GetPage(); if (page == null) return; // 检查页面是否为空 PageNumber = pdfDoc.GetPageNumber(page); var pageNumberParagraph = new LightParagraph(string.Format(FooterSection.PageNumberXofY.Text, CultureInfo.InvariantCulture, PageNumber), FontSize.Weight8, FontUtil); pageNumberParagraph.GetAccessibilityProperties().SetRole(StandardRoles.ARTIFACT); var autoP = pdfDoc.GetTagStructureContext().GetAutoTaggingPointer(); var posBackup = new TagTreePointer(autoP); PagesTag.TryGetValue(PageNumber, out TagTreeInfo p); if (p?.TagTreePointer != null) { int indexInParentKidsList = p.TagTreePointer.GetIndexInParentKidsList(); autoP.MoveToPointer(p.TagTreePointer).MoveToParent(); if (p.Tagged) { autoP.SetNextNewKidIndex(indexInParentKidsList + 1); } } var pdfCanvas = new PdfCanvas(page.GetLastContentStream(), page.GetResources(), pdfDoc); try { var rect = new Rectangle(pdfDoc.GetDefaultPageSize().GetX() + FooterDocument.GetLeftMargin(), FooterSection.Content.PageMargin, -Width.Size50, TableHeight); using Canvas canvas = new(pdfCanvas, pdfDoc, rect); canvas.EnableAutoTagging(page); Div footer = null; if (PagesTag.Count != PageNumber && PagesTag.Count > PageNumber) { footer = ArtifactFooter; canvas.Add(footer); var placeHolder = new PdfFormXObject(new Rectangle(0, 0, Side, Side)); PlaceHolders.Add(placeHolder); pdfCanvas.AddXObject(placeHolder, X, Y - Descent, 1, true); } else if (PagesTag.Count == PageNumber)// 单页场景 { footer = DivFooter; canvas.Add(footer); } } finally { pdfCanvas.Release(); } if (p?.TagTreePointer != null) { autoP.MoveToPointer(posBackup); } }
内容的提问来源于stack exchange,提问作者wonder.glen
相关产品推荐
相关产品推荐

