【问题标题】:Add Page bookmarks to an existing PDF using iTextSharp using C# code使用 iTextSharp 使用 C# 代码将页面书签添加到现有 PDF
【发布时间】:2013-12-20 11:32:36
【问题描述】:

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

【问题讨论】:

    标签: c# pdf itextsharp bookmarks


    【解决方案1】:

    请咨询official documentation

    书签在Chapter 7 中进行了讨论,您可以在其中找到BookmarkedTimeTable 示例。当您使用 iTextSharp (C#) 而不是 iText (Java) 时,您需要在 the list of examples ported to C#,更具体地说是 BookmarkedTimeTable.cs 中查找相应的示例。

    更新问题后更新:

    您的错误表明testdata 并不是真正的IList&lt;Dictionar(string,object)&gt; 类型;请注意,我在 strin 中添加了一个 g,假设这是您的问题中的错字,而不是您的实际代码中的错字。

    请从我书中的示例开始,然后逐渐更改该示例,直到您破坏该代码。

    根据额外评论更新:

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

    【讨论】:

    • 感谢您的帮助....我在 BookmarkedTimeTable.cs 的帮助下修改了我的代码,但无法理解“dest”文件引用,在评论部分提到-使用文件 dest 操作 PDF 文件 src,但在代码中我找不到任何 ref abt dest,如果我错了,请纠正...
    • 在您相应的 Java 示例的帮助下,我设法解决了这个问题,非常感谢....
    • 请帮我解决这个问题...stackoverflow.com/questions/20877294/…
    • @NachiappanR 你在劫持一个可以追溯到 2013 年的问题。不要那样做!如果你有一个问题,例如,如果你有尝试了这篇文章中解释的内容,如果不起作用,请解释您在新问题中尝试过的内容,并解释您遇到的问题。在评论中说“我也在寻找 相同的东西”,通常不会得到答案。它只会惹恼人们,特别是因为您可以在 this page 的底部找到所有 C# 示例。
    • 我看到了这个问题。就好像您甚至没有阅读文档一样。这可能就是为什么没有人愿意回答这个问题的原因。你有一个完整的团队,没有人努力访问 iText 官方网站。
    【解决方案2】:

    试着把它变成一个实际的 Hashtables 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 2011-05-06
      • 1970-01-01
      • 2013-02-09
      • 2013-02-10
      • 1970-01-01
      相关资源
      最近更新 更多