2015-02-20 5 views
0

Я работаю с одним PDF, содержащим несколько документов. В каждом документе есть закладка. Мне нужно прочитать имена закладок для приложения для согласования, которое я создаю. Код ниже не работает для меня. Я пытаюсь поместить имя закладки в строку . Может ли кто-нибудь дать какие-либо указания? Большое спасибо.Java: Чтение имен PDF-файлов с помощью itext

PdfReader reader = new PdfReader("C:\\Work\\Input.pdf"); 
List<HashMap<String,Object>> bookmarks = SimpleBookmark.getBookmark(reader); 

for(int i = 0; i < bookmarks.size(); i++){ 

    HashMap<String, Object> bm = bookmarks.get(i); 
    String title = ((String)bm.get("Title")); 

} 
+1

Что вы имеете в виду, если не работаете? я попробовал свой код, и возвращается весь заголовок верхнего уровня. – Todoy

+0

Я думал, что это «не работает», потому что переменная title не указана в разделе «Переменные». Я сделал еще одно тестирование, чтобы проверить, что заглавная переменная заполняется заголовками закладок. Большое спасибо. – jcalder

ответ

2

Вы не принимая во внимание, что закладки хранятся в древовидной структуре с ветвей и листьев (в спецификации PDF, это называется набросков дерево).

Как говорит @Todoy в разделе комментариев, ваш код работает на высшем уровне, но если вы хотите увидеть все названия, вам нужно использовать рекурсивный метод, который также смотрит на "Kids".

Взгляните на this code sample:

public void inspectPdf(String filename) throws IOException, DocumentException { 
    PdfReader reader = new PdfReader(filename); 
    List<HashMap<String,Object>> bookmarks = SimpleBookmark.getBookmark(reader); 
    for (int i = 0; i < bookmarks.size(); i++){ 
     showTitle(bookmarks.get(i)); 
    } 
    reader.close(); 
} 

public void showTitle(HashMap<String, Object> bm) { 
    System.out.println((String)bm.get("Title")); 
    List<HashMap<String,Object>> kids = (List<HashMap<String,Object>>)bm.get("Kids"); 
    if (kids != null) { 
     for (int i = 0; i < kids.size(); i++) { 
      showTitle(kids.get(i)); 
     } 
    } 
} 

showTitle() метод является рекурсивным. Он называет себя, если в исследуемой записи закладок есть дети. С помощью этого фрагмента кода вы можете пройти через все ветви и листья дерева контуров.