生成pdf带跳转的书签
作为一个程序员,每天都会接触很多pdf资料,分享一个快速创建pdf书签的方法。
先ctrl+alt+l调出腾讯qq的文本识别,识别pdf的目录,然后调整一下到下面的格式,目前支持三层目录,改下程序可以支持更多复杂层级的目录:
//标题格式: //一级:书签+空格+页码 //二级:tab+书签+空格+页码 //三级:tab+tab+书签+空格+页码
封面 1
版权信息 2
内容简介 3
前言 4
第1章收银台业务 5
1.1现金收银台 5
1.2POS机收银台 7
1.3Web收银台 9
1.4融合收银台 12
1.4.1短信代收费 12
1.4.2充值卡 14
1.4.3银行卡 16
1.4.4WAP支付 20
1.4.5支付宝 22
1.4.6微信支付 26
1.4.7代金券 27
然后写程序插入pdf,部分代码:
public class BookInsert {
//书签
public static class BookTemp{
Integer id;
Integer page;
String title;
Integer level;
Integer pid;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getLevel() {
return level;
}
public void setLevel(Integer level) {
this.level = level;
}
public Integer getPid() {
return pid;
}
public void setPid(Integer pid) {
this.pid = pid;
}
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
@Override
public String toString() {
return "BookTemp{" +
"id=" + id +
", page=" + page +
", title='" + title + '\'' +
", level=" + level +
", pid=" + pid +
'}';
}
}
//读取书签文本
public static List<BookTemp> readTxt(String txt) throws Exception{
ArrayList<String> lines=new ArrayList<>();
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(txt),"UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
lines.add(line);
}
br.close();
//判断分别的级别
ArrayList<BookTemp> bookTemps = new ArrayList<>();
for(int i =0;i<lines.size();i++){
String[] r = lines.get(i).split(" ");
BookTemp temp = new BookTemp();
//一个tab开头为二级标题
if(lines.get(i).startsWith("\t")&&!lines.get(i).startsWith("\t\t")){
temp.setLevel(2);
}
//两个tab开头为三级标题
else if(lines.get(i).startsWith("\t\t")){
temp.setLevel(3);
}
//无tab开头为一级标题
else{
temp.setLevel(1);
}
temp.setId(i);
temp.setTitle(r[0].replace("\t",""));
temp.setPage(Integer.valueOf(r[1]));
temp.setPid(-1);
bookTemps.add(temp);
}
//建立pid关联关系
int lastLevel1 = 0;//最近一次level1标签的下标
int lastLevel2 = 0;//最近一次level2标签下标
for(int i =0;i<bookTemps.size() ;i++){
BookTemp bt = bookTemps.get(i);
if(bt.level==1){
lastLevel1 = i;
continue;
}
if(bt.level==2){
lastLevel2 = i;
bt.setPid(lastLevel1);
continue;
}
if(bt.level==3){
bt.setPid(lastLevel2);
}
}
bookTemps.stream().forEach(n->{
System.out.println(n.toString());
});
return bookTemps;
}
/**
* @Desc: 添加多级书签
* @Date: 2020/10/16 9:27
* @auth: TYF
*/
public static void addMark(String sPdf,String bookTxt) throws Exception{
//打开文档
Document document = new Document();
//新pdf名称
String[] a = sPdf.split(".pdf");
String dPdf = a[0]+"_new.pdf";
PdfCopy writer = new PdfCopy(document, new FileOutputStream(dPdf));
writer.setViewerPreferences(PdfWriter.PageModeUseOutlines);
document.open();
//打开源pdf复制到新pdf
PdfReader reader = new PdfReader(sPdf);
int n = reader.getNumberOfPages();
for (int i = 1; i <= n; i++) {
writer.addPage(writer.getImportedPage(reader, i));
}
//添加书签
writer.freeReader(reader);
PdfOutline root = writer.getRootOutline();
//书签文本转书签对象
List<BookTemp> bookTemps = readTxt(bookTxt);
bookTemps.stream().forEach(filter1->{
if(filter1.getLevel().equals(1)){
//建立一级标签
PdfAction actionLevel1 = PdfAction.gotoLocalPage(filter1.page,new PdfDestination(PdfDestination.FIT), writer);
PdfOutline outlineLevel1 = new PdfOutline(root, actionLevel1, filter1.title, false);
System.out.println("一级:"+filter1.title+" "+filter1.page);
bookTemps.stream().forEach(filter2->{
//建立二级标签,要挂载一级标签下面
if(filter2.getLevel().equals(2)&&filter1.getId().equals(filter2.getPid())){
System.out.println("二级:"+filter2.title+" "+filter2.page);
PdfAction action2 = PdfAction.gotoLocalPage(filter2.page,new PdfDestination(PdfDestination.FIT), writer);
PdfOutline outlineLevel2 = new PdfOutline(outlineLevel1, action2, filter2.title, false);
bookTemps.stream().forEach(filter3->{
//建立三级标签,要挂载二级标签下面
if(filter3.getLevel().equals(3)&&filter2.getId().equals(filter3.getPid())){
PdfAction action3 = PdfAction.gotoLocalPage(filter3.page,new PdfDestination(PdfDestination.FIT), writer);
PdfOutline outlineLevel3 = new PdfOutline(outlineLevel2, action3, filter3.title, false);
System.out.println("三级:"+filter3.title+" "+filter3.page);
}
});
}
});
}
});
document.close();
}
效果:
版权声明:本文为qq_34448345原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。