c# - 如何获取和设置注释PDF itext c#的/BSIColumnData的值
问题描述
如何使用 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();
}
解决方案
我看到两个错误:
您尝试像这样使用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)
.
推荐阅读
- angular5 - Angular 中 enableProdMode() 的用途是什么
- java - 是否可以将字符串 10 与数字 10 相乘
- wordpress - 将来自 Linkedin 帖子的评论整合回 Wordpress
- keras - Keras 加载的 png 显示为全黑
- powershell - 列出 PowerShell 中特定用户的文件夹权限
- angularjs - 双语应用的AngularJs密码表
- node.js - 如何修复“多次调用 Api” - 一个非常奇怪的问题
- html - 使用 CSS 和 z-index,如何将作为子元素的子元素放置在顶部父元素之后?
- excel - 有没有办法使用VBA从excel中的网页下载多个pdf文件
- python - 如何将经过身份验证的用户链接到 formModel