java使用renderer将pdf按页转换为图片

项目中遇到了需要把用户上传的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);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java将图片组合成PDF文件的方法

    本文实例为大家分享了Java将图片组合成PDF文件的具体代码,供大家参考,具体内容如下 程序界面图: 代码清单: package 将图片组合成PDF文件; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileFilter; import java.io.FileOutputStream; import java.io.IOE

  • java实现PDF转图片的方法

    本文实例为大家分享了java实现PDF转图片的具体代码,供大家参考,具体内容如下 1.首先利用maven引入所需jar包 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.1</version> </dependency> <dependency> <g

  • java中pdf转图片的实现方法

    JAVA中实现pdf转图片可以通过第三方提供的架包,这里介绍几种常用的,可以根据自身需求选择使用. 一.icepdf.有收费版和开源版,几种方法里最推荐的.转换的效果比较好,能识别我手头文件中的中文,就是转换后可能字体的关系部分字间距有点宽.因为,字体支持是要收费的,所以转换的图片会带有官方的水印.去水印的方法可以查看另一篇文章:icepdf去水印方法 1.下载icepdf的架包,并导入项目中,这里用到4个,如下: 2.附上代码例子: String filePath = "c:/test.pdf

  • java实现在pdf模板的指定位置插入图片

    本文实例为大家分享了java在pdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下 java操作pdf有个非常好用的库itextpdf,maven: <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.6</version> </dependency> <!--

  • Java使用icepdf将pdf文件按页转成图片

    本文实例为大家分享了Java使用icepdf将pdf文件按页转成图片的具体代码,供大家参考,具体内容如下 Maven icepdf包,这里过滤掉jai-core <dependency> <groupId>org.icepdf.os</groupId> <artifactId>icepdf-core</artifactId> <version>6.1.2</version> <exclusions> <e

  • java使用renderer将pdf按页转换为图片

    项目中遇到了需要把用户上传的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 ja

  • java实现pdf按页转换为图片

    本文实例为大家分享了java实现pdf按页转换为图片的具体代码,供大家参考,具体内容如下 本程序是利用jacob.jar包实现的,关于jacob.jar的配置见我上一篇文章,程序中可配置参数选择图片清晰图. package core.util; import java.awt.Image; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.File

  • java实现截取PDF指定页并进行图片格式转换功能

    1.引入依赖 <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.16</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifa

  • Java设置PDF跨页表格重复显示表头行的步骤详解

    目录 前言 1.导入Jar包 2.Java代码 总结 前言 在创建表格时,如果表格内容出现跨页显示的时候,默认情况下该表格的表头不会在下一页显示,在阅读体验上不是很好.下面分享一个方法如何在表格跨页是显示表格的表头内容,这里只需要简单使用方法 grid.setRepeatHeader(true);即可. 具体参考如下方法步骤. 1.导入Jar包 这里导入的是Free Spire.PDF for Java的jar包,Spire.PDF for Java 支持的功能非常丰富,例如 PDF 文档安全性

  • Java生成pdf文件或jpg图片的案例讲解

    在一些业务场景中,需要生成pdf文件或者jpg图片,有时候还需要带上水印.我们可以事先用freemarker定义好html模板,然后把模板转换成pdf或jpg文件. 同时freemarker模板还支持变量的定义,在使用时可以填充具体的业务数据. 1.Maven导包 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</ar

  • Java实现Excel转PDF的两种方法详解

    目录 一.使用spire转化PDF 1.使用spire将整个Excel文件转为PDF 2.指定单个的sheet页转为PDF 二.使用jacob实现Excel转PDF(推荐使用) 1.环境准备 2.执行导出PDF 使用具将Excel转为PDF的方法有很多,在这里我给大家介绍两种常用的方法,分别应对两种不一样的使用场景,接下来我在springboot环境下给大家做一下演示! 一.使用spire转化PDF 首先介绍一种比较简单的方法,这种方法可以使用短短的几行代码就可以将我们的Excel文件中的某一个

  • Java实现Html转Pdf的方法

    本文实例讲述了Java实现Html转Pdf的方法.分享给大家供大家参考.具体如下: package test; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.lowagie.

  • itext生成PDF设置页眉页脚的实例详解

    itext生成PDF设置页眉页脚的实例详解 实例代码: /** * ITextTest * iText生成PDF加入列表,注释等内容,同时设置页眉和页脚及页码等. */ package com.labci.itext.test; import java.awt.Color; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import com.lo

  • java实现Img与PDF相互转换

    本文实例为大家分享了java实现Img与PDF相互转换的具体代码,供大家参考,具体内容如下 不善于表达,就直接贴出代码吧.请大牛忽视我. import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Input

随机推荐