Как получить и установить значение для /BSIColumnData аннотации PDF itext c#

#c# #itext #itext7

#c# #itext #itext7

Вопрос:

Как получить и установить значение для /BSIColumnData аннотации (разметки) в формате PDF, используя itext c # в качестве прикрепленного файла? Я использую приведенный ниже код 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-rups5.5.9 вы можете увидеть, как показано ниже: введите описание изображения здесь

Комментарии:

1.Вы не говорите нам, какая ошибка в BSIColumnData существует. Я предполагаю ошибку компиляции. Правильно? Пожалуйста, обновите свой вопрос и опишите ошибку.

Ответ №1:

Я вижу две ошибки:

  • Вы пытаетесь использовать имя 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) .