Java:使用itext读取PDF书签名称

时间:2015-02-20 16:54:19

标签: java pdf itext

我正在使用包含多个文档的单个PDF。每个文档都有一个书签。我需要阅读我正在构建的对帐应用程序的书签名称。以下代码对我不起作用。我正在尝试将书签名称放在 title 字符串中。有人可以提供任何指导吗?非常感谢你。

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 个答案:

答案 0 :(得分: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()方法是递归的。如果检查的书签条目有孩子,它会调用自己。使用此代码段,您可以遍历大纲树的所有分支和叶子。