一、依赖

<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>fontbox</artifactId>
  <version>2.0.9</version>
</dependency>
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.9</version>
</dependency>

二、工具类

 

package cn.richinfo.admin.common.util;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import org.apache.commons.fileupload.FileItem;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 将pdf文件转换成图片工具类
 *
 * @author yangcongshang
 * @since 2019-11-20
 */
public class PdfToPictureUtil {

    private static final Logger logger = LoggerFactory.getLogger(PdfToPictureUtil.class);

    public static class Picture {
        private String name;

        private InputStream data;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public InputStream getData() {
            return data;
        }

        public void setData(InputStream data) {
            this.data = data;
        }
    }

    /**
     *
     * @param fileItem
     * @param type
     * @return
     */
    public static List<Picture> pdf2Picture(FileItem fileItem, String type, String customFileName) {
        // 将pdf装图片 并且自定义图片的格式、大小
        List<Picture> files = new ArrayList<>();
        Picture file;
        if (NullJudgeUtil.isEmpty(fileItem)) {
            return files;
        }

        try {
            PDDocument doc = PDDocument.load(fileItem.getInputStream());
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
                ImageIO.write(image, type, outputStream);

                file = new Picture();
                file.setName(customFileName + "_页面_" + (i + 1) + "." + type);
                file.setData(new ByteArrayInputStream(outputStream.toByteArray()));
                files.add(file);
            }
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
            return null;
        }
        return files;
    }

    public static void pdf2Picture(String fileAddress, String filename, String type) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress + "\\" + filename + ".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            for (int i = 0; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                ImageIO.write(image, type,
                    new File(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type));
            }
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        }
    }

    /**
     * 自由确定起始页和终止页
     *
     * @param fileAddress 文件地址
     * @param filename pdf文件名
     * @param indexOfStart 开始页  开始转换的页码,从0开始
     * @param indexOfEnd 结束页  停止转换的页码,-1为全部
     * @param type 图片类型
     */
    public static void pdf2Picture(String fileAddress, String filename, int indexOfStart, int indexOfEnd, String type) {
        // 将pdf装图片 并且自定义图片得格式大小
        File file = new File(fileAddress + "\\" + filename + ".pdf");
        try {
            PDDocument doc = PDDocument.load(file);
            int numberOfPages = doc.getNumberOfPages();
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount;
            if (indexOfEnd == -1) {
                pageCount = numberOfPages;
            }
            else {
                pageCount = numberOfPages >= indexOfEnd ? indexOfEnd : numberOfPages;
            }

            for (int i = indexOfStart; i < pageCount; i++) {
                BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI
                // BufferedImage srcImage = resize(image, 240, 240);//产生缩略图
                ImageIO.write(image, type,
                    new File(fileAddress + "\\" + filename + "_" + (i + 1) + "." + type));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        System.out.println(start);
        PdfToPictureUtil.pdf2Picture("F:\\大后台需求\\测试合同", "简单一点点的", "jpg");
        System.out.println(System.currentTimeMillis() - start);
    }

}