今天做PDF文件解析,遇到一個需求:提取文件中的圖片並保存。使用的是流行的apache開源jar包pdfbox, 但還是遇到坑了,比如pdfbox版本太高或太低都不能用!!這個包竟然沒有很好地做好兼容問題,有些方法在高版本說舍棄就舍棄了。暫時沒有時間去研究版本間的區別。以下給我這個問題的解決方案。
pdfbox版本:1.8.13
maven傳送門:
<!-- 處理pdf文件 -->
<!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.8.13</version>
</dependency>
代碼:
package com.tbd.util;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
/**
* 提取PDF中的圖片
* pdfbox 版本 1.8.13
* @author Charlie Wu
* 2018/05/24
*/
public class PDF2Image {
/**
* 提取
* @param file PDF文件
* @param targetFolder 圖片存放目錄
* @return
*/
public static boolean extractImages(File file, String targetFolder) {
boolean result = true;
try{
PDDocument document = PDDocument.load(file);
List<PDPage> pages = document.getDocumentCatalog().getAllPages();
Iterator<PDPage> iter = pages.iterator();
int count = 0;
while( iter.hasNext()){
PDPage page = (PDPage)iter.next();
PDResources resources = page.getResources();
Map<String, PDXObjectImage> images = resources.getImages();
if(images != null)
{
Iterator<String> imageIter = images.keySet().iterator();
while(imageIter.hasNext())
{
count++;
String key = (String)imageIter.next();
PDXObjectImage image = (PDXObjectImage)images.get( key );
String name = file.getName() + "_" + count; // 圖片文件名
image.write2file(targetFolder + name); // 保存圖片
}
}
}
} catch(IOException ex){
ex.printStackTrace();
return false;
}
return result;
}
public static void main(String[] args) {
File file = new File("F:/test.pdf");
String targerFolder = "F:/target/";
extractImages(file, targerFolder);
}
}
