经验分享之使用pdfbox截取pdf(java)

来源:互联网 发布:linux terminal 字体 编辑:程序博客网 时间:2024/06/05 07:39


背景:最近总是和PDF打交道,学习到很多内容,其中从PDF中截取某几页内容很是打动我的心啊,下面介绍一下这块内容。我使用的是PDFbox2.0.3。


一、简单介绍


   Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所需的内容。Apache PDFBox还包含了数个命令行工具。
   Apache PDFbox的最新版本是2.0.5。

   https://pdfbox.apache.org/


二、需求分析


   我使用的测试文件是双页的PDF文件,于是,有了一个需求就是截取颜色相同的内容(我这里用相同的颜色代表同一篇文章。),截图如下:



三、功能实现


引入PDFBox的jar包:



java代码:

 /**   * 根据起始页和文章页数截取PDF-何丽杰-2017-04-12   * pdfFilePath:PDF文件的全路径   * depositPath:新生成PDF的全路径   * totalPage:PDF文件的总页数   * pgStartPos:PDF文件的起始位置,L左边,R右边   * startPage:文章的起始页   * pageNum:文章的页数   */  @Override  public boolean generateSubPdf(String pdfFilePath,String depositPath,int totalPage,String pgStartPos,int startPage, int pageNum) {    boolean flag;    flag=false;        int stopPage = startPage + pageNum - 1;    //处理结束页    String pgStopPos=null;    if(stopPage % 2 == 0){      pgStopPos="L";    }else if(stopPage % 2 == 1){      pgStopPos="R";    }       //处理起始页    if (startPage == 1) {      startPage = 1;      stopPage = 1;    }    else if (startPage == totalPage) {      startPage = (startPage + 2) / 2;      stopPage = startPage;     }    else {      if (startPage % 2 == 1) {        startPage = (startPage + 1) / 2;      }      else if (startPage % 2 == 0) {        startPage = (startPage + 2) / 2;      }      if( stopPage % 2 == 1){        stopPage = (stopPage + 1) / 2;      }else if(stopPage % 2 == 0){        stopPage = (stopPage + 2) / 2;      }    }    //处理总页数    int pageCount = (totalPage+2)/2;    //截取PDF    try {      PDDocument helloDocument = PDDocument.load(new File(pdfFilePath));      PDPageTree pdpt=helloDocument.getDocumentCatalog().getPages();      Iterator<PDPage> it=pdpt.iterator();      PDDocument doc = null;      doc = new PDDocument();      int i=1;      PDPage pdp;      for(;it.hasNext();){        if(i<=stopPage&&i>=startPage){          pdp=(org.apache.pdfbox.pdmodel.PDPage) it.next();          PDRectangle r=pdp.getCropBox();          if(startPage == 1 || startPage == pageCount){          }else{          if(pageNum == 1){            if(pgStartPos.equals("R")){              r.setLowerLeftX(r.getUpperRightX()/2);                r.setLowerLeftY(0);            }            if(pgStartPos.equals("L")){              r.setUpperRightX(r.getUpperRightX()/2);                r.setUpperRightY(r.getUpperRightY());            }          }else{            if(i == startPage){              if(pgStartPos.equals("R")){                r.setLowerLeftX(r.getUpperRightX()/2);                  r.setLowerLeftY(0);              }            }else if(i == stopPage){              if(pgStopPos.equals("L")){                r.setUpperRightX(r.getUpperRightX()/2);                  r.setUpperRightY(r.getUpperRightY());              }            }          }          }          pdp.setCropBox(r);          doc.addPage(pdp);        }else{          it.next();        }        i++;      }      doc.save(depositPath);      doc.close();  } catch (Exception e) {    e.printStackTrace();  }    return flag;  }    @Test  public void dotest(){    //String pdfFilePath,String depositPath,int totalPage,String pgStartPos,int startPage, int pageNum    String pdfFilePath="C:\\Users\\丽杰\\Desktop\\测试文件.pdf";    String depositPath="D:\\test.pdf";    generateSubPdf(pdfFilePath,depositPath,12,"R",3,3);  }



四、效果




五:学习心得


1、在不断的实践中学习到更多的内容

2、自己接触的知识面还是有点窄,多多经历,多多积累

3、办法总比困难多,况且很多困难别人已经解决了,自己引用过来就可以了





0 0
原创粉丝点击