使用pdfbox分頁保存pdf為圖片


一、背景


 

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM