我的要求与此问题中描述的相同:Bookmark to specific page using 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,因为文件已损坏。
答案 0 :(得分:1)
在Chapter 7中讨论了书签,您可以在其中找到BookmarkedTimeTable示例。当您使用iTextSharp(C#)而非iText(Java)时,您需要在the list of examples ported to C#中查找相应的示例,更具体地说是BookmarkedTimeTable.cs。
更新问题后更新:
您的错误表明testdata
实际上不属于IList<Dictionar(string,object)>
类型;请注意,我已将 g 添加到 strin ,假设这是您问题中的拼写错误,而不是实际代码中的。
请从我的书中的示例开始,然后逐渐更改该示例,直到您破坏该代码。
根据额外评论进行更新:
对PDF进行数字签名时,可能(或可能不)允许的操作数量有限。请参阅Which operations are allowed on a digitally signed PDF?添加书签不是允许的操作,因此您必须在应用更改之前删除所有签名字段。根据您是否要保留空签名字段或完全删除字段,您将使用方法clearSignatureField()
或removeField()
将签名字段的名称作为参数传递。您可以使用ArrayList
方法获取getSignatureNames()
个名称(请参阅ÀcroFields
)。
答案 1 :(得分:0)
尝试使其成为哈希表的实际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;