当我在 PDF 查看器中打开 PDF 时,我会在实际文档的左侧看到一系列书签。那里显示的信息似乎并不构成文档实际内容的一部分:它没有打印出来,它没有出现在特定页面上。
如何使用 Java 提取这些书签?
当我在 PDF 查看器中打开 PDF 时,我会在实际文档的左侧看到一系列书签。那里显示的信息似乎并不构成文档实际内容的一部分:它没有打印出来,它没有出现在特定页面上。
如何使用 Java 提取这些书签?
OP 问题要求使用 Java 解决方案。
但是,对于必须处理 PDF 的人来说,这可能是一个更普遍感兴趣的话题。所以我的回答提供了一个命令行解决方案:mutool
.
mutool
是与MuPDF 查看器软件捆绑在一起的命令行实用程序,由为我们提供 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:
您可以清楚地看到,/Outlines
内容与包含的目录页面有何不同(但相似)。
以下是大纲(“书签”)在 Adobe Reader XI 中的显示方式:
请在 StackOverflow 上下载免费的电子书The Best iText Questions。在那本书中,您将找到许多问题的答案,包括使用 iTextSharp 在 VB.NET 中阅读 PDF 书签的问题
提取书签最酷的方法是创建一个 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();
要使用 Java 从 PDF 文件中检索书签内容,您可以使用 PDFlib+PDI 9 的 pCOS 接口。pCOS Cookbook 中包含示例代码: http ://www.pdflib.com/en/pcos-cookbook/interactive -元素/书签/