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