將PDF按頁數切割成多個圖片

導入jar:
    <!-- https://mvnrepository.com/artifact/com.kenai.nbpwr/com-sun-pdfview -->
        <dependency>
            <groupId>com.kenai.nbpwr</groupId>
            <artifactId>com-sun-pdfview</artifactId>
            <version>1.0.5-201003191900</version>
        </dependency>

import java.awt.Image;  
import java.awt.Rectangle;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.RandomAccessFile;  
import java.lang.reflect.Method;  
import java.nio.MappedByteBuffer;  
import java.nio.channels.FileChannel;  
import java.security.AccessController;  
import java.security.PrivilegedAction;  
  


import com.sun.image.codec.jpeg.JPEGCodec;  
import com.sun.image.codec.jpeg.JPEGEncodeParam;  
import com.sun.image.codec.jpeg.JPEGImageEncoder;  
import com.sun.pdfview.PDFFile;  
import com.sun.pdfview.PDFPage; 

public class pdfToImage {

	public static void main(String[] args) {
		String instructiopath = "E://pdfToBarCode//201811150009.pdf";
		String picturepath = "E://pdfToBarCode//pagesize2018-12-21";
		System.out.println(changePdfToImg(instructiopath, picturepath));
	}
    public static int changePdfToImg(String instructiopath,String picturepath) {  
        int countpage =0;  
        try {  
            //instructiopath ="D:/instructio/2015-05-16/Android 4編程入門經典.pdf"  
            //picturepath = "D:/instructio/picture/2015-05-16/";  
              
            File file = new File(instructiopath);  
            RandomAccessFile raf = new RandomAccessFile(file, "r");  
            FileChannel channel = raf.getChannel();  
            MappedByteBuffer buf = channel.map(FileChannel.MapMode.READ_ONLY,  
                    0, channel.size());  
            PDFFile pdffile = new PDFFile(buf);  
            //創建圖片文件夾  
            File dirfile = new File(picturepath);  
               if(!dirfile.exists()){  
                     dirfile.mkdirs();  
                }  
            //獲得圖片頁數  
            countpage = pdffile.getNumPages();  
            for (int i = 1; i <= pdffile.getNumPages(); i++) {  
                PDFPage page = pdffile.getPage(i);  
                Rectangle rect = new Rectangle(0, 0, ((int) page.getBBox()  
                        .getWidth()), ((int) page.getBBox().getHeight()));  
                int n = 2;  
                /** 圖片清晰度(n>0且n<7)【pdf放大參數】 */  
                Image img = page.getImage(rect.width * n, rect.height * n,  
                        rect, /** 放大pdf到n倍,創建圖片。 */  
                        null, /** null for the ImageObserver */  
                        true, /** fill background with white */  
                        true /** block until drawing is done */  
                );  
                BufferedImage tag = new BufferedImage(rect.width * n,  
                        rect.height * n, BufferedImage.TYPE_INT_RGB);  
                tag.getGraphics().drawImage(img, 0, 0, rect.width * n,  
                        rect.height * n, null);  
                /** 
                 * File imgfile = new File("D:\\work\\mybook\\FilesNew\\img\\" + 
                 * i + ".jpg"); if(imgfile.exists()){ 
                 * if(imgfile.createNewFile()) { System.out.println("創建圖片:"+ 
                 * "D:\\work\\mybook\\FilesNew\\img\\" + i + ".jpg"); } else { 
                 * System.out.println("創建圖片失敗!"); } } 
                 */  
                FileOutputStream out = new FileOutputStream(picturepath+"/" + i  
                        + ".png");  
                /** 輸出到文件流 */  
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
                JPEGEncodeParam param2 = encoder.getDefaultJPEGEncodeParam(tag);  
                param2.setQuality(1f, true);  
                /** 1f~0.01f是提高生成的圖片質量 */  
                encoder.setJPEGEncodeParam(param2);  
                encoder.encode(tag);  
                /** JPEG編碼 */  
                out.close();  
            }  
            channel.close();  
            raf.close();  
            unmap(buf);  
            /** 如果要在轉圖片之後刪除pdf,就必須要這個關閉流和清空緩衝的方法 */  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return countpage;  
          
    }  
  
    @SuppressWarnings("unchecked")  
    public static void unmap(final Object buffer) {  
        AccessController.doPrivileged(new PrivilegedAction() {  
            public Object run() {  
                try {  
                    Method getCleanerMethod = buffer.getClass().getMethod(  
                            "cleaner", new Class[0]);  
                    getCleanerMethod.setAccessible(true);  
                    sun.misc.Cleaner cleaner = (sun.misc.Cleaner) getCleanerMethod  
                            .invoke(buffer, new Object[0]);  
                    cleaner.clean();  
                } catch (Exception e) {  
                    e.printStackTrace();  
                }  
                return null;  
            }  
        });  
    }  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章