Java实现pdf转图片

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

## Java实现pdf转图片 ** 置顶@@@

提示:以下是本篇文章正文内容,下面案例可供参考

一、依赖JAR

<!--ITextPdf,操作PDF文件的工具类-->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.4.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.15</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.15</version>
        </dependency>

二、代码工具类

package com.example.demo.utils;

import com.google.common.collect.Maps;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
 * @Author HOUJL
 * @Date 2021/10/28
 * @Description: Java实现pdf转图片
 */
public class PDFToImage {
    private static final Logger LOGGER = LoggerFactory.getLogger(PDFToImage.class);

    /**
     * Java实现pdf转图片(pdf转为多张图片)
     * param filePath
     * param savePath
     * param subStr
     * return
     */
    public static List<String> pdfToImagePaths(String filePath, String savePath, String subStr) {
        List<String> list = new ArrayList<>();
        String fileDirectory = filePath.substring(0, filePath.lastIndexOf("."));
        String imagePath;
        File file = new File(filePath);
        try {
            File f = new File(fileDirectory);
            if (!f.exists()) {
                f.mkdir();
            }
            PDDocument doc = PDDocument.load(file);
            PDFRenderer renderer = new PDFRenderer(doc);
            int pageCount = doc.getNumberOfPages();
            /**
             * 方式1,第二个参数是设置缩放比(即像素)
             * BufferedImage image = renderer.renderImageWithDPI(i, 296);
             */
            for (int i = 0; i < pageCount; i++) {
                //方式2,第二个参数是设置缩放比(即像素) 第二个参数越大生成图片分辨率越高,转换时间也就越长
                BufferedImage image = renderer.renderImage(i, 1.25f);
                imagePath = savePath + File.separator + subStr + "-" + i + ".jpg";
                ImageIO.write(image, "PNG", new File(imagePath));
                list.add(imagePath);
            }
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }
        return list;
    }

    /**
     * Java实现pdf转图片(pdf转为一张长图片)
     * param pdfFile pdf的路径
     * param outpath 输出的图片的路径[包括名称]
     */
    public static void pdfMultiImage(String pdfFile, String outpath) {
        try {
            ArrayList<BufferedImage> piclist = new ArrayList<>();
            File file = new File(pdfFile);
            PDDocument doc = PDDocument.load(file);
            //pdfbox 1.8
            /*
                List<?> pages = doc.getDocumentCatalog().getAllPages();
                for(int i=0;i<pages.size();i++){
                    PDPage page=(PDPage)pages.get(i);
                    bis.add(page.convertToImage());
                }
            */
            //pdfbox2.0以后
            int pages = doc.getNumberOfPages();
            //分辨率
            int dpi = 200;
            for (int i = 0; i < pages; i++) {
                BufferedImage image = new PDFRenderer(doc).renderImageWithDPI(i, dpi, ImageType.RGB);
                piclist.add(image);
            }
            yPic(piclist, outpath);
        } catch (IOException e) {
            LOGGER.error(e.getMessage());
        }
    }

    /**
     * pdfbox 1.6/1.8 实现
     * 将pdf中的maxPage页,转换成一张图片
     *
     * @param pdfFile pdf的路径
     * @param outpath 输出的图片的路径[包括名称]
     * @param maxPage pdf的页数
     *                【比如Pdf有3页,如果maxPage=2,则将pdf中的前2页转成图片,如果超过pdf实际页数,则按实际页数转换】
     */
    private static void pdf2multiImage(String pdfFile, String outpath, int maxPage) {
        //try {
        //    InputStream is = new FileInputStream(pdfFile);
        //    PDDocument pdf = PDDocument.load(is, true);
        //    List<PDPage> pages = pdf.getDocumentCatalog().getAllPages();
        //    List<BufferedImage> piclist = new ArrayList<BufferedImage>();
        //    // pdf中实际的页数
        //    int actSize = pages.size();
        //    if (actSize < maxPage) {
        //        maxPage = actSize;
        //    }
        //    for (int i = 0; i < maxPage; i++) {
        //        piclist.add(pages.get(i).convertToImage());
        //    }
        //    yPic(piclist, outpath);
        //    is.close();
        //} catch (IOException e) {
        //    e.printStackTrace();
        //}
    }

    /**
     * 将宽度相同的图片,竖向追加在一起 ##注意:宽度必须相同
     *
     * @param piclist 文件流数组
     * @param outPath 输出路径
     */
    public static void yPic(List<BufferedImage> piclist, String outPath) {
        if (piclist == null || piclist.size() <= 0) {
            LOGGER.error("图片数组为空!");
            return;
        }
        try {
            // 总高度,总宽度 ,临时的高度 , 或保存偏移高度,临时的高度,主要保存每个高度,图片的数量
            int height = 0, width = 0, _height, __height, picNum = piclist.size();
            // 保存每个文件的高度
            int[] heightArray = new int[picNum];
            // 保存图片流
            BufferedImage buffer;
            // 保存所有的图片的RGB
            List<int[]> imgRgb = new ArrayList<>();
            // 保存一张图片中的RGB数据
            int[] _imgRGB;
            for (int i = 0; i < picNum; i++) {
                buffer = piclist.get(i);
                // 图片高度
                heightArray[i] = _height = buffer.getHeight();
                if (i == 0) {
                    // 图片宽度
                    width = buffer.getWidth();
                }
                // 获取总高度
                height += _height;
                // 从图片中读取RGB
                _imgRGB = new int[width * _height];
                _imgRGB = buffer.getRGB(0, 0, width, _height, _imgRGB, 0, width);
                imgRgb.add(_imgRGB);
            }
            // 设置偏移高度为0
            _height = 0;
            // 生成新图片
            BufferedImage imageResult = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            for (int i = 0; i < picNum; i++) {
                __height = heightArray[i];
                // 计算偏移高度
                if (i != 0) {
                    _height += __height;
                }
                imageResult.setRGB(0, _height, width, __height, imgRgb.get(i), 0, width);
            }
            File outFile = new File(outPath);
            // 写图片
            ImageIO.write(imageResult, "jpg", outFile);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }
    }

    /**
     * 获取文件夹下所有文件
     * param path
     * return
     */
    public static ArrayList<String> getDirPathFiles(String path) {
        ArrayList<String> files = new ArrayList<>();
        Map<String, Object> map = Maps.newHashMap();
        File file = new File(path);
        File[] tempList = file.listFiles();
        for (int i = 0; i < Objects.requireNonNull(tempList).length; i++) {
            if (tempList[i].isFile()) {
                files.add(tempList[i].toString());
                map.put(tempList[i].getAbsolutePath(), tempList[i].getName());
            }
        }
        return files;
    }
}

三、main测试

   /**
     * PdfReport_New-1-0.jpg PdfReport_New-1-1.jpg
     * <p>
     * param args
     */
    public static void main(String[] args) {
        //ArrayList<String> files = new ArrayList<>();
        //Map<String, String> map = Maps.newHashMap();
        ArrayList<String> list = getDirPathFiles("D:\\pdfile");
        //File file = new File("D:\\pdfile");
        //File[] tempList = file.listFiles();
        //for (int i = 0; i < Objects.requireNonNull(tempList).length; i++) {
        //    if (tempList[i].isFile()) {
        //        files.add(tempList[i].toString());
        //        map.put(tempList[i].getAbsolutePath(), tempList[i].getName().substring(0, tempList[i].getName().lastIndexOf(".")));
        //    }
        //}
        //for (int i = 0; i < files.size(); i++) {
        //    try {
        //        String filePath = files.get(i);
        //        List<String> stringList = pdfToImagePaths(filePath, "D:\\pacsFile", map.get(filePath) + "-" + i + "");
        //        System.out.println(stringList);
        //    } catch (Exception e) {
        //        e.printStackTrace();
        //    }
        //}
        pdfMultiImage("D:\\pdfile\\PdfReport.pdf", "D:\\pacsFile\\pdf.jpg");
    }

总结

pdfbox 1.6/1.8实现的有稍微差别 注意!!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值