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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 19:30:53