【发布时间】:2017-09-06 10:08:31
【问题描述】:
我正在使用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,由于在 GetAsArray 行返回了 null,此代码将失败并显示 NullReferenceException。
仔细观察 PdfDictionary 和 PdfArray 类型 - 它们只有 1 个条目,没有枚举器 (!),没有 LINQ 支持。
我的问题:
- (基于意见,但我很想听到答案)为什么 iText 7 的功能比 5 少?我想两者都混合吗?
- (对场外资源的请求)在某处是否有适当的 C# iText 7 文档?从 java 转换并在 SO 上过滤几十个关于它的问题是非常低效的。
- (有点咆哮)我到底应该如何调试这些类型?谈到
PdfDictionary,它显示了 1 个条目,可能尚未解析 PDF 的内容。我想看看GetAsArray为什么会失败,但是我没有办法调试它。 - (实际问题)为什么上面的代码对于某些包含命名目的地的 pdf 会失败(例如 this one,但我在本地有更多)?
我是不是做错了什么?
【问题讨论】: