我正在玩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
而失败。
仔细查看PdfDictionary
和PdfArray
类型 - 它们只有1个条目,没有枚举器(!),没有LINQ支持。
我的问题:
PdfDictionary
,它显示了1个条目,可能还没有解析PDF的内容。我想知道GetAsArray
失败的原因,但我无法调试它。我做错了吗?
答案 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();
...
}