itextpdf5.5.13版本读取pdf文件的目录标题与页码
1、导入pom的jar
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
2、 BookMark实体类
import java.io.Serializable;
/**
* 书籍标签目录实体
*/
public class BookMark implements Serializable {
public BookMark() {
}
public BookMark(int page, String title) {
this.page = page;
this.title = title;
}
/**
* 书的目录标题
*/
private String title;
/**
* 书的目录标题对应的页面
*/
private int page;
//此处省略
// get/set方法
}
3、处理目录标签信息
private static void showBookmark(Map bookmark, List<BookMark> bookMarks) {
//读起来的格式 {Action=GoTo, Title=封面, Page=1 XYZ 0 665 1.0}
String pageStr = (String) bookmark.get("Page");
String title = (String) bookmark.get("Title");
//此处可以使用判断是否存在XYZ进行处理,防止不规范的目录
int page = Integer.valueOf(pageStr.toUpperCase().split("XYZ")[0].replace(" ", ""));
bookMarks.add(new BookMark(page, title));
//判断是否有子节点
ArrayList kids = (ArrayList) bookmark.get("Kids");
if (kids == null)
return;
for (Iterator i = kids.iterator(); i.hasNext(); ) {
showBookmark((Map) i.next(), bookMarks);
}
}
//递归打印pdf文件的标签目录信息
public static void printPdfMarkInfo(String filePath) {
try {
PdfReader reader = new PdfReader(filePath);
List list = SimpleBookmark.getBookmark(reader);
List<BookMark> bookMarks = new ArrayList<>();
for (Iterator i = list.iterator(); i.hasNext(); ) {
showBookmark((Map) i.next(), bookMarks);
}
/*
*此处是方便用面向对象处理数据,看个人情况需要。
*/
for (BookMark bookMark : bookMarks) {
System.out.println(bookMark.getPage() + "-->" + bookMark.getTitle());
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
4、测试类
public class Test1 {
public static void main(String[] args) throws Exception {
String pdfPath = "D:\\test.pdf";
printPdfMarkInfo(pdfPath);
}
5、总结
此方法是学习使用过程中的笔记,并没非工作中的实现代码,每个人的需求不一样,仅提供简单的
demo
的使用。