枚举命名目的地

时间:2017-09-06 10:08:31

标签: c# itext7

我正在玩iText 7,我在获取指定目的地列表方面遇到了问题。

使用以前的版本5,使用帮助程序非常容易:

using (var reader = new PdfReader(_file))
{
    var items = SimpleNamedDestination.GetNamedDestination(reader, false).Select(o => o.Key).ToList();
    ...
}

在7我找不到助手了,不得不使用这个怪物(改编自official java example的代码):

using (var reader = new PdfDocument(new PdfReader(file)))
{
    var catalog = reader.GetCatalog().GetPdfObject();
    var names = catalog.GetAsDictionary(PdfName.Names);
    var dests = names.GetAsDictionary(PdfName.Dests);
    var name = dests.GetAsArray(PdfName.Names); // problem

    var items = new List<string>();
    for (int i = 0; i < name.Size(); i += 2)
        items.Add(name.GetAsString(i).ToString());
    ...
}

此外,对于某些PDF,由于在NullReferenceException行返回null,此代码因GetAsArray而失败。

仔细查看PdfDictionaryPdfArray类型 - 它们只有1个条目,没有枚举器(!),没有LINQ支持。

我的问题:

  • (基于意见,但我很想知道答案)为什么iText 7的功能少于5?我想我想混合两个?
  • (异地资源请求)是否有适当的C#iText 7文档?从Java转换并在SO上过滤关于它的几十个问题是非常低效的。
  • (有点咆哮)我该怎么调试这些类型呢?谈到PdfDictionary,它显示了1个条目,可能还没有解析PDF的内容。我想知道GetAsArray失败的原因,但我无法调试它。
  • (实际问题)为什么上面的代码对于某些包含命名目标的pdf失败(例如this one,但我还有更多本地代码)?

我做错了吗?

1 个答案:

答案 0 :(得分:1)

我不知道C#,但在Java中,可以使用getNameTree()方法获取名称树。我假设在iText 7的C#版本中存在类似的方法GetNameTree()

Map<String, PdfObject> names =
    pdfDoc.getCatalog().getNameTree(PdfName.Dests).getNames();
for (Map.Entry<String, PdfObject> name : names.entrySet()) {
    System.out.println("Name = " + name.getKey());
    System.out.println("Page = " + name.getValue().toString());
}

如果可以使用C#语法更新我的答案,如果事实证明我的答案有帮助,那就太棒了。

C#:

using (var pdf = new PdfDocument(new PdfReader(file)))
{
    var names = pdf.GetCatalog().GetNameTree(PdfName.Dests).GetNames().Select(o => o.Key).ToList();
    ...
}