pdfbox将多页pdf转成多张长图片

首先需要说明的几点事情

  1. 本文是基于pdfbox2.0以上版本实现的
  2. 主要实现功能是将多页的pdf文件转成1张png或者jpg图片,或者多张jpg图片
  3. 本文是借鉴将多页pdf转成1张长图片的方法修改

功能由来

最近项目要求能够实现office(word, excel,ppt)等的在线预览功能,思路是分2步走

  1. office组件转pdf,即是先将office组件转成pdf进行上传
  2. pdf转成长图片,即是将pdf转成长图片的形式,便于操作

引入jar包

  1. 基于maven管理jar包的形式,如果没有使用maven的话,也可以去pdfbox官网查看
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox-tools</artifactId>
            <version>2.0.1</version>
        </dependency>
    

下面贴上代码

  1. 这是将多页(至少超过50)pdf转换为多张长图片的代码
  2. 至于转成1张长图片(png)或者每一页pdf转一张图片,相似的例子有很多,我就不重复造轮子了
public static void pdfToImage(String pdfPath) throws IOException {
       try {
               /*图像合并使用参数*/
               // 定义宽度
               int width = 0;
               // 保存一张图片中的RGB数据
               int[] singleImgRGB;
               // 定义高度,后面用于叠加
               int shiftHeight = 0;
               //保存每张图片的像素值
               BufferedImage imageResult = null;
               // 利用PdfBox生成图像
               PDDocument pdDocument = PDDocument.load(new File(pdfPath));
               PDFRenderer renderer = new PDFRenderer(pdDocument);
               /*根据总页数, 按照50页生成一张长图片的逻辑, 进行拆分*/
               // 每50页转成1张图片
               int pageLength = 50;
               // 总计循环的次数
               int totalCount = pdDocument.getNumberOfPages() / pageLength + 1;
               for (int m = 0; m < totalCount; m++) {
                   for (int i = 0; i < pageLength; i++) {
                       int pageIndex = i + (m * pageLength);
                       if (pageIndex == pdDocument.getNumberOfPages()) {
                           System.out.println("m = " + m);
                           break;
                       }
                       // 96为图片的dpi,dpi越大,则图片越清晰,图片越大,转换耗费的时间也越多
                       BufferedImage image = renderer.renderImageWithDPI(pageIndex, 96, RGB);
                       int imageHeight = image.getHeight();
                       int imageWidth = image.getWidth();
                       if (i == 0) {
                           //计算高度和偏移量
                           //使用第一张图片宽度;
                           width = imageWidth;
                           // 保存每页图片的像素值
                           // 加个判断:如果m次循环后所剩的图片总数小于pageLength,则图片高度按剩余的张数绘制,否则会出现长图片下面全是黑色的情况
                           if ((pdDocument.getNumberOfPages() - m * pageLength) < pageLength) {
                               imageResult = new BufferedImage(width, imageHeight * (pdDocument.getNumberOfPages() - m * pageLength), BufferedImage.TYPE_INT_RGB);
                           } else {
                               imageResult = new BufferedImage(width, imageHeight * pageLength, BufferedImage.TYPE_INT_RGB);
                           }
                       } else {
                           // 将高度不断累加
                           shiftHeight += imageHeight;
                       }
                       singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
                       imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
                   }
                   System.out.println("m = " + m);
                   File outFile = new File(pdfPath.replace(".pdf", "_" + m + ".jpg"));
                   System.out.println(outFile.getName());
                   // 写图片
                   ImageIO.write(imageResult, "jpg", outFile);
                   // 这个很重要,下面会有说明
                   shiftHeight = 0;
               }
               pdDocument.close();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

关于产生2种报错信息的说明

  1. javax.imageio.IIOException: Maximum supported image dimension is 65500 piexls
    在这里插入图片描asddad述
    产生这种错误的原因是我想将多页的pdf转成1张长图片(jpg格式会有,而png则不会)所致,经本人多次尝试,这个上限大概在50-60张之间,超过的话,基本100%会报这个错
  2. 数组下标越界异常
    在这里插入图片描述
    产生这个错误的原因是因为上面的代码种,在写完1张图片后,未将shiftHeight置为0所致

写在最后

  1. 抱歉是忘了参考哪位大神的了,如有雷同,请大神联系我;小弟一定加上你的连接
  2. 欢迎大家有问题在下面评论哈,相互交流,一起成长
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值