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

时间:2013-12-20 11:32:37

标签: c# pdf itextsharp bookmarks

我的要求与此问题中描述的相同: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,因为文件已损坏。

2 个答案:

答案 0 :(得分:1)

请参阅official documentation

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;