生成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 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>