使用C#代码,使用iTextSharp将页面书签添加到现有PDF中



我的要求与本问题中描述的相同:使用iTextSharp 4.1.6 将书签添加到特定页面

我试着回答,但最后一行给出了以下错误:

无法将ArrayList隐式转换为IList<Dictionar(strin,object)>

我不知道如何更正。

给出错误的行是,在上面链接的答案1中

wri.Outlines = bookmarks

我修改了这个例子:

List<Dictionary<string, object>> testData = new List<Dictionary<string, object>>(100);
// Just Sample data for understanding.
//for (int i = 0; i < 100; i++)
//{
var test = new Dictionary<string, object>
{
{ "Action", "GoTo"},
{ "Title", "Page1 0 H 0" },
{"Page", "1 XYZ 0 " + h + " 0" }
};
testData.Add(test);
//}
wri.Outlines = testData;

现在添加书签后,我无法打开PDF,因为文件已损坏。

请参阅官方文档。

书签将在第7章中讨论,您将在其中找到BookmarkedTimeTable示例。当你使用iTextSharp(C#)而不是iText(Java)时,你会想在移植到C#的示例列表中查找相应的示例,更具体地说是BookmarkedTimeTable.cs。

更新问题后更新:

您的错误表明testdata实际上不是IList<Dictionar(string,object)>类型;请注意,我在strin中添加了一个g,假设这是您的问题中的拼写错误,而不是实际代码中的错误。

请从我书中的例子开始,然后逐渐改变这个例子,直到你破坏了代码。

根据额外注释进行更新:

当PDF进行数字签名时,允许(或不允许)的操作数量有限。请参阅允许对数字签名PDF执行哪些操作?添加书签是不允许的操作,因此在应用更改之前必须删除所有签名字段。根据是保留空的签名字段还是完全删除该字段,您将使用传递签名字段名称作为参数的方法clearSignatureField()removeField()。您可以使用getSignatureNames()方法获得名称的ArrayList(请参见ÀcroFields)。

尝试将其作为哈希表的实际ArrayList:

var outlines = firstComponentPages.Select(x => new Hashtable()
{
{"Title", x.Value},
{"Action", "GoTo"},
{"Page", $"{x.Key} Fit"}
}).ToList();

var outlinesArrayList = new ArrayList();
foreach (var outline in outlines)
{
outlinesArrayList.Add(outline);
}
copy.Outlines = outlinesArrayList;

最新更新