今天做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); } }