枚举命名目的地

Enumerate named destinations

我正在玩 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,由于 nullGetAsArray 行返回,此代码失败并显示 NullReferenceException

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

我的问题:

我是不是做错了什么?

我不懂 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();
    ...
}