91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java使用renderer將pdf按頁轉換為圖片

發布時間:2020-10-18 17:59:09 來源:腳本之家 閱讀:213 作者:papima 欄目:編程語言

項目中遇到了需要把用戶上傳的word,execl,ppt每頁截圖保存。需要先用到jacob把資源轉換為pdf,在通過pdf-renderer把每頁截圖下來。

首先下載相關jar包:下載地址

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; 
//如果com.sun.image找不到,就是Eclipse默認把這些受訪問限制的API設成了ERROR。只要把Windows-Preferences-Java-Complicer-Errors/Warnings里面的Deprecated and restricted API中的Forbidden references(access rules)選為Warning就可以編譯通過
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:/臨時文件1.pdf";
 String picturepath = "E:/臨時文件1/";
 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轉化成圖片后,釋放MappedByteBuffer資源。調用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; 
      } 
    }); 
  } 
}

成功釋放MappedByteBuffer資源

Method m = FileChannelImpl.class.getDeclaredMethod("unmap",
    MappedByteBuffer.class);
   m.setAccessible(true);
   m.invoke(FileChannelImpl.class, buf);

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屯昌县| 光泽县| 台北县| 深圳市| 呼和浩特市| 弥勒县| 攀枝花市| 新和县| 新乡县| 田阳县| 将乐县| 桐城市| 德庆县| 响水县| 灵山县| 青海省| 招远市| 兰西县| 池州市| 西畴县| 武宁县| 蛟河市| 濮阳县| 青铜峡市| 忻州市| 伊川县| 紫阳县| 宁德市| 安阳县| 长子县| 安溪县| 民权县| 福泉市| 邯郸市| 大城县| 仪征市| 永康市| 永和县| 特克斯县| 柳州市| 民县|