1. 程式人生 > >經驗分享之使用pdfbox擷取pdf(java)

經驗分享之使用pdfbox擷取pdf(java)

背景:最近總是和PDF打交道,學習到很多內容,其中從PDF中擷取某幾頁內容很是打動我的心啊,下面介紹一下這塊內容。我使用的是PDFbox2.0.3。

一、簡單介紹

   Apache PDFbox是一個開源的、基於Java的、支援PDF文件生成的工具庫,它可以用於建立新的PDF文件,修改現有的PDF文件,還可以從PDF文件中提取所需的內容。Apache PDFBox還包含了數個命令列工具。
   Apache PDFbox的最新版本是2.0.5。

二、需求分析

   我使用的測試檔案是雙頁的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、辦法總比困難多,況且很多困難別人已經解決了,自己引用過來就可以了