System.NullReferenceException:“对象引用未设置为对象的实例。”页面为空

问题描述 投票:0回答:1

我正在测试这个方法,检查要显示的特定标签页脚。

这里是函数:

    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);

    }

对于这个测试,我需要创建 pdf,设置和构建页脚部分。我在pdf中添加了页眉和“页脚测试”,我还设置了要标记的文档。

我不知道为什么如果我向其中添加标题和段落,我总是得到页面为空。

c# unit-testing pdf itext7
1个回答
0
投票

solution for itext7 itext pdf document System.NullReferenceException: 'Object reference not set to an instance of an object.'

最终我从 Westley Bennett 那里找到了解决方案:

显然 iText 有一些内部错误/异常,它们只是某种“跳过”和“推过去”,因为我偶然意识到我在 Visual Studios 中禁用了“仅启用我的代码”,所以我的系统试图调试 iText7 的代码以及我的代码。当我在我的 Visual Studio 设置中重新启用它时(工具 > 选项 > 调试 > 常规 > 启用我的代码复选框),问题神奇地消失了。

Visual Studio 中的设置

所以我花了四个小时试图解决他们代码中的问题,但他们显然找到了一些解决方法,即使在空引用失败时也能通过该方法。

我的转换为 PDF 功能现在工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.