如何从PDF中提取书签?

时间:2015-04-15 12:27:49

标签: java pdf pdf-parsing

当我在PDF查看器中打开PDF时,我会在实际文档的左侧看到一系列书签。这里显示的信息似乎并不构成文档实际内容的一部分:它没有打印,也没有出现在特定页面上。

如何使用Java提取这些书签?

3 个答案:

答案 0 :(得分:4)

OP问题要求使用Java解决方案。

然而,对于必须处理PDF的人来说,这可能是一个更普遍感兴趣的话题。所以我的回答提供了一个命令行解决方案:mutool

mutool 是与 MuPDF viewer 软件捆绑在一起的命令行实用程序,由给我们Ghostscript的同一家公司编写。

其最新版本包含 show 子命令,可用于打印outlines(这是PDF技术用语中的内容OP和Adobe UI调用“书签”),以及PDF中感兴趣的其他特定项目:

$ mutool show PDF32000_2008.pdf outlines

  Document management — Portable document format — Part 1: PDF 1.7  1
  Contents Page 3
  Foreword  6
  Introduction  7
  1 Scope   9
  2 Conformance 9
    2.1 General 9
    2.2 Conforming readers  9
    2.3 Conforming writers  9
    2.4 Conforming products 10
  3 Normative references    10
  4 Terms and definitions   14
  5 Notation    18
  6 Version Designations    18
  7 Syntax  19
    7.1 General 19
    7.2 Lexical Conventions 19
        7.2.1 General   19
        7.2.2 Character Set 20
        7.2.3 Comments  21
  [....]

(缩短了输出。)原始PDF文档(官方PDF-1.7规范),包含此页面作为ToC:

Original Document

您可以清楚地看到/Outlines内容与所包含的目录页面的不同(但相似)。

以下是Adobe Reader XI中显示轮廓(“书签”)的方式:

enter image description here

答案 1 :(得分:3)

请下载免费的电子书The Best iText Questions on StackOverflow。在那本书中,您将找到许多问题的答案,包括问题Reading PDF Bookmarks in VB.NET using iTextSharp

提取书签的最酷方法是创建一个XML文件,以一种很好的分层方式显示书签:

PdfReader reader = new PdfReader(src);
List<HashMap<String, Object>> list = SimpleBookmark.getBookmark(reader);
SimpleBookmark.exportToXML(list,
    new FileOutputStream(dest), "ISO8859-1", true); 
reader.close();

答案 2 :(得分:2)

要使用Java从PDF文件中检索书签内容,您可以使用PDFlib + PDI 9的pCOS界面.pCOS Cookbook中包含示例代码: http://www.pdflib.com/en/pcos-cookbook/interactive-elements/bookmarks/