經驗分享之使用pdfbox擷取pdf(java)
阿新 • • 發佈:2018-12-31
背景:最近總是和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、辦法總比困難多,況且很多困難別人已經解決了,自己引用過來就可以了