iText Acrofields 为空,form.getAsArray(PdfName.FIELDS) 也为空

iText Acrofields Are Empty, form.getAsArray(PdfName.FIELDS) is also null

我正在使用 iText7.NET。第三方为 PDF 提供了字段,字段存在并且 Adob​​e Acrobat 似乎没有问题打开和显示 PDF,但在 iText 中字段集合是空的。

我已经在 ItextSharp - Acrofields are empty 和 iText 网站上的相关知识库文章中看到了答案,但修复对我来说不起作用,因为 form.getAsArray(PdfName.FIELDS ) returns null, 所以不能加.

我还检查了 Xfa,但似乎不存在

XfaForm xfa = form.GetXfaForm();
xfa.IsXfaPresent()  // returns false

是否可以将 PdfName.FIELDS 添加到文档中然后填充?

谢谢

所以我想我已经找出导致问题的原因,并对我的特殊情况进行了短期修复。在本文档中,一些字段是子类型“Link”,而不是“Widget”,我使用的修复代码(基于上面的 link,很可能来自这里 https://kb.itextsupport.com/home/it7kb/faq/why-are-the-acrofields-in-my-document-empty)将失败.我的解决方法是跳过子类型 link,尽管可能存在更好的解决方案,它不会跳过 Links,我不需要。

如果我不跳过 Links,当再次加载保存的 PDF 时它会失败

            PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);

在 itext.forms 的较低级别代码中,调用了 IterateFields() 并在其中将 formField.GetParent() 作为参数传递给 PdfFormField.MakeFormField、GetParent() returns Link 字段为空,因此出现异常。

下面是导致问题的第一个子类型 Link 字段的 RUPS 层次结构

因此,目前解决我的特定问题的解决方案是跳过子类型 links。代码如下

            PdfReader reader = new PdfReader(pdf);
            MemoryStream dest = new MemoryStream();
            PdfWriter writer = new PdfWriter(dest);
            PdfDocument pdfDoc = new PdfDocument(reader, writer);
            PdfCatalog root = pdfDoc.GetCatalog();
            PdfDictionary form = root.GetPdfObject().GetAsDictionary(PdfName.AcroForm);
            PdfArray fields = form.GetAsArray(PdfName.Fields);
            if (fields == null)
            {
                form.Put(PdfName.Fields, new PdfArray());
                fields = form.GetAsArray(PdfName.Fields);
            }
            for (int i = 1; i <= pdfDoc.GetNumberOfPages(); i++)
            {
                PdfPage page = pdfDoc.GetPage(i);
                var annots = page.GetAnnotations();
                for (int j = 0; j < annots.Count(); j++)
                {
                    PdfObject o = annots[j].GetPdfObject();
                    PdfDictionary m = o as PdfDictionary;
                    string subType = m?.GetAsName(PdfName.Subtype)?.GetValue() ?? "";
                    if (subType != "Link")
                    {
                        fields.Add(o);
                        fields.SetModified();
                    }
                }
            }
            pdfDoc.Close();