一、背景
pdfbox作為Apache開源的PDF操作工具,允許創建新的PDF文檔,操作現有文檔,以及從文檔中提取內容的能力。Apache PDFBox還包括一些命令行實用工具。本文樓主主要介紹其中的PDF轉圖片的功能,有其他功能需求的同學,可以去官網讀讀文檔,https://pdfbox.apache.org/
二、准備工作
只需兩個jar,pdfbox-2.0.7.jar,font-box-2.0.7.jar,當然用maven或gradle的同學,只需引入pdfbox就行了,依賴添加,樓主給大家准備在下面,直接取就OK。
gradle添加依賴:
1 //添加pdfbox的依賴 2 compile('org.apache.pdfbox:pdfbox:2.0.7')
maven添加依賴:
1 <dependency> 2 <groupId>org.apache.pdfbox</groupId> 3 <artifactId>pdfbox</artifactId> 4 <version>2.0.7</version> 5 </dependency>
其次,就是准備pdf文檔一份,用來解析。
三、代碼實現
代碼不是很多,不超過100行,樓主給出了很全面的注釋:
1 package cn.apache.poi.pdf; 2 3 import org.apache.pdfbox.io.RandomAccessBuffer; 4 import org.apache.pdfbox.pdfparser.PDFParser; 5 import org.apache.pdfbox.pdmodel.PDDocument; 6 import org.apache.pdfbox.pdmodel.PDPage; 7 import org.apache.pdfbox.rendering.PDFRenderer; 8 9 import javax.imageio.IIOImage; 10 import javax.imageio.ImageIO; 11 import javax.imageio.ImageWriter; 12 import javax.imageio.stream.ImageOutputStream; 13 import java.awt.image.BufferedImage; 14 import java.io.*; 15 import java.util.Iterator; 16 17 /** 18 * Created by Jon_China on 2017/7/30. 19 */ 20 public class Pdf2Image { 21 public final static String IMG_TYPE_JPG = "jpg"; 22 public final static String IMG_TYPE_PNG = "png"; 23 public static void main( String[] args ) throws IOException{ 24 Pdf2Image pdf2Image = new Pdf2Image(); 25 pdf2Image.pdf2img("E:\\java測試\\java測試\\程序1\\待轉換文件\\待轉換pdf.pdf", "D:",IMG_TYPE_PNG); 26 } 27 28 29 /** 30 * PDF轉圖片 31 * @param pdfPath pdf文件的路徑 32 * @param savePath 圖片保存的地址 33 * @param imgType 圖片保存方式 34 */ 35 public void pdf2img(String pdfPath,String savePath,String imgType){ 36 String fileName = pdfPath.substring(pdfPath.lastIndexOf("\\")+1, pdfPath.length()); 37 fileName = fileName.substring(0,fileName.lastIndexOf(".")); 38 InputStream is = null; 39 PDDocument pdDocument = null; 40 try { 41 is = new BufferedInputStream(new FileInputStream(pdfPath)); 42 //創建pdf文件解析器 43 PDFParser parser = new PDFParser(new RandomAccessBuffer(is)); 44 parser.parse(); 45 //獲取解析后的pdf文檔 46 pdDocument = parser.getPDDocument(); 47 //獲取pdf渲染器,主要用來后面獲取BufferedImage 48 PDFRenderer renderer = new PDFRenderer(pdDocument); 49 //獲取pdf文件總頁數 50 int pageCount = pdDocument.getNumberOfPages(); 51 for (int i = 0; i < pageCount; i++) { 52 //構造保存文件名稱格式 53 String saveFileName = savePath+"\\"+fileName+"-"+i+"."+imgType; 54 //獲取當前頁對象 55 PDPage page = pdDocument.getPage(i); 56 //圖片轉換 57 pdfPage2Img(page,saveFileName,imgType,renderer,i); 58 } 59 } catch (Exception e) { 60 e.printStackTrace(); 61 }finally{ 62 if(pdDocument != null){ 63 try { 64 pdDocument.close(); 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 } 69 } 70 } 71 72 /** 73 * 將pdf單頁轉換為圖片 74 * @param page 當頁對象 75 * @param saveFileName 保存的圖片名稱 76 * @param imgType 保存的圖片類型 77 * @param renderer 用於獲取BufferedImage 78 * @param index 頁索引 79 * @throws IOException 80 */ 81 public void pdfPage2Img(PDPage page,String saveFileName,String imgType,PDFRenderer renderer,int index) throws IOException{ 82 //構造圖片 83 BufferedImage img_temp = renderer.renderImage(index); 84 //設置圖片格式 85 Iterator<ImageWriter> it = ImageIO.getImageWritersBySuffix(imgType); 86 //將文件寫出 87 ImageWriter writer = (ImageWriter) it.next(); 88 ImageOutputStream imageout = ImageIO.createImageOutputStream(new FileOutputStream(saveFileName)); 89 writer.setOutput(imageout); 90 writer.write(new IIOImage(img_temp, null, null)); 91 } 92 }
就是這么簡單,源碼地址,請戳https://github.com/LJunChina/MineKnowContainer/tree/master/pdf