背景:最近總是和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、辦法總比困難多,況且很多困難別人已經解決了,自己引用過來就可以了