2017-09-06 64 views
2

我在玩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,此代碼由於null返回GetAsArray行而導致NullReferenceException失敗。

仔細查看PdfDictionaryPdfArray類型 - 它們只有1個條目,沒有枚舉(!),沒有LINQ支持。

我的問題:

  • (意見爲主,但我很好奇聽到的答案)爲什麼iText的7具有較少的功能比5?我是否想混合兩者?
  • (請求非現場資源)有沒有適當的C#iText 7文檔?從java轉換和過濾關於它的幾十個問題是非常低效的。
  • (有點咆哮)我該如何調試這些類型的地獄?談到PdfDictionary,它顯示1個條目,可能還沒有解析PDF的內容。我想知道爲什麼GetAsArray失敗,但是我無法調試它。
  • (實際問題)爲什麼上面的代碼對於某些包含指定目標的pdf失敗(例如this one,但我在本地有更多)?

我做錯了什麼?

回答

1

我不知道C#,但在Java中,人們會用getNameTree()方法得到名稱樹。我想類似的方法GetNameTree()存在的iText 7的C#版本:

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(); 
    ... 
} 
+0

@Sinatr感謝您加入C#語法。非常感激! –