Warm tip: This article is reproduced from serverfault.com, please click

其他-如何获取和设置注释PDF的/ BSIColumnData的值itext C#

(其他 - How to get and set value for /BSIColumnData of an annotation PDF itext c#)

发布于 2020-12-24 09:43:10

如何使用itext c#作为附件在PDF中获取和设置注释(标记)的/ BSIColumnData的值?我在下面使用Itext7代码,但在BSIColumnData处出错:

public void BSIcontents ()
    {
        string pdfPath = @"C:\test PDF.pdf";
        iText.Kernel.Pdf.PdfReader pdfReader = new iText.Kernel.Pdf.PdfReader(pdfPath);
        iText.Kernel.Pdf.PdfDocument pdfDoc = new iText.Kernel.Pdf.PdfDocument(pdfReader);
        int numberOfPages = pdfDoc.GetNumberOfPages();

        int z = 0;
            for (int i = 1; i <= numberOfPages; i++)
            {
                iText.Kernel.Pdf.PdfDictionary page = pdfDoc.GetPage(i).GetPdfObject();
                iText.Kernel.Pdf.PdfArray annotArray = page.GetAsArray(iText.Kernel.Pdf.PdfName.Annots);
                if (annotArray == null)
                {
                    z++;
                    continue;
                }
                int size = annotArray.Size();
                for (int x = 0; x < size; x++)
                {
                    iText.Kernel.Pdf.PdfDictionary curAnnot = annotArray.GetAsDictionary(x);
                    if (curAnnot != null)
                    {
                        if (curAnnot.GetAsString(iText.Kernel.Pdf.PdfName.BSIColumnData) != null)
                        {
                            MessageBox.Show("BSIColumnData: " + curAnnot.GetAsString(iText.Kernel.Pdf.PdfName.BSIColumnData).ToString());
                        }
                    }
                }
            }
        pdfReader.Close();
    }

在Bluebeam Revu中,你可以看到以下内容: 在此处输入图片说明

在Itext-rups 5.5.9中,你可以看到以下内容: 在此处输入图片说明

Questioner
Dragon
Viewed
0
mkl 2020-12-27 17:38:24

我看到两个错误:

  • 你尝试使用BSIColumnData名称,如下所示:

    iText.Kernel.Pdf.PdfName.BSIColumnData
    

    假设PdfName你的自定义名称已经有一个静态成员。但是当然没有,只有在itext本身中使用的标准名称的预定义成员。如果要使用其他名称,则必须自己创建一个PdfName实例并使用该实例,例如:

    var BSIColumnData = new iText.Kernel.Pdf.PdfName("BSIColumnData");
    
  • 你尝试检索该名称的值作为字符串

    curAnnot.GetAsString(iText.Kernel.Pdf.PdfName.BSIColumnData)
    

    但从你的RUPS屏幕截图中可以清楚地看到,该名称的值是一个字符串数组。因此,即使在按照第一项所述进行校正之后,也GetAsString(BSIColumnData)将返回null而是做

    var BSIColumnData = new iText.Kernel.Pdf.PdfName("BSIColumnData");
    var array = curAnnot.GetAsArray(BSIColumnData);
    

    检查之后,if (array != null)你现在可以使用来访问位于其各自索引处的字符串array.GetAsString(index)