今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存。使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容问题,有些方法在高版本说舍弃就舍弃了。暂时没有时间去研究版本间的区别。以下给我这个问题的解决方案。
pdfbox版本:1.8.13
maven传送门:
org.apache.pdfbox
pdfbox
1.8.13
代码:
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 filePDF文件
* @param targetFolder 图片存放目录
* @return
*/
public static boolean extractImages(File file, String targetFolder) {
boolean result = true;
try{
PDDocument document = PDDocument.load(file);
List pages = document.getDocumentCatalog().getAllPages();
Iterator iter = pages.iterator();
int count = 0;
while( iter.hasNext()){
PDPage page = (PDPage)iter.next();
PDResources resources = page.getResources();
Map images = resources.getImages();
if(images != null)
{
Iterator 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);
}
}