(pdfbox将pdf转成图片(jpg或者png)

  • 首先需要说明的几点事情
    • 功能由来
    • 引入jar包
    • 下面贴上代码
    • 关于产生2种报错信息的说明
    • 写在最后

首先需要说明的几点事情

  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

    产生这种错误的原因是我想将多页的pdf转成1张长图片(jpg格式会有,而png则不会)所致,经本人多次尝试,这个上限大概在50-60张之间,超过的话,基本100%会报这个错
  2. 数组下标越界异常

    产生这个错误的原因是因为上面的代码种,在写完1张图片后,未将shiftHeight置为0所致

写在最后

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

pdfbox将多页pdf转成多张长图片相关推荐

  1. 在windows平台下php使用imagick库把pdf转换成(合并)图片

    在windows平台下php使用imagick库把pdf转换成(合并)图片 开发背景 上传的word文档需要转换成图片,在网上找了资料,主要是先转换成pdf: 1. 在windows下用com组件加上 ...

  2. 为什么PDF转成Word后是图片,怎么才能修改?

    众所周知,PDF文件是很难被直接修改,最多也就是局部性的修改,而且限制还颇多.因为我们通常会想到将PDF转成Word,再进行修改,现在有很多工具,确实也有很好的转换效果,如果PDF页面不是很复杂的话, ...

  3. pdf转成word | ppt | jpg图片,免费一键转换教程

    我不允许真的还有人不知道如何免费将pdf转成 ppt.word 或者 jpg图片! 职场小伙伴是不是会经常遇到pdf怎么转成word,pdf怎么转成word,pdf怎么jpg图片等问题?别再为pdf转 ...

  4. Python 实现 GIF 动态图片分解 , 多帧动态图分解成多张静态图片

    文章目录 需求 实现 参考 需求 有时候你看到一张动态图片,其中的一个画面你觉得很不错,想从中提取出来.例如以下这张由多个漂亮小姐姐组成的 GIF 动态图: 实现 GIF 动态图片是由多张静态图片组合 ...

  5. Java工具类pdfbox将多个pdf合并成一个pdf。

    引入maven依赖: <!-- 将两个或多个单独的PDF文件合并成一个PDF文件--><dependency><groupId>org.apache.pdfbox& ...

  6. 利用ffmpeg将mp4视频转换成多张jpg图片

    分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acodec ...

  7. 将一张图片分割成多张小图片 Python3

  8. 用PS怎样把一张图片切割成几张小图片?

    1.打开PS,点击左上角的"文件",在文件中,点击"打开",先把图片保存在电脑上,然后找到图片,点击打开. 2.打开图片后,右击左侧工具栏中的"剪裁工 ...

  9. 怎么把做好的ps保存成图片_PS怎么把一张图片切片保存成多张png图片?

    做过网页设计的朋友,想必一定用过ps进行切图,有时候会用到保存透明背景图片,那么就要用到png图片格式,下面就来教教大家怎么切出png图标! 1.首先我们会用到一张ico图标素材(如下一张作为实验案例 ...

最新文章

  1. JavsScript--on与addEventListener的使用与两者的不同
  2. UA MATH636 信息论7 高斯信道简介
  3. winform调用webservice增删查改_教你分别用数据库与云函数实现“增删查改”
  4. 在新浪潮中,服务教育是你的竞争利器
  5. GHOST系统时出现“A:\GHOSTERR.TXT”的解决方法
  6. insert ... on duplicate key update产生death lock死锁原理
  7. 长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
  8. Linux管理磁盘配额
  9. ecshop nginx php-fpm,ecshop在nginx下配置常见问题
  10. python用一行代码画个迷宫_用 Python 制作一个迷宫游戏
  11. 利用NAS寻找最佳GAN:AutoGAN架构搜索方案专为GAN打造
  12. 质疑“扩版=质量下降”——以《中国农学通报》和《安徽农业科学》为例
  13. VS2010 + OpenCL 1.1 @ Windows 7 + AMD HD6870
  14. std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
  15. 驾考你准备好了吗 之 交通标志、标线篇
  16. C#二次开发金橙子MarkEzd.dll激光打标机
  17. ps去水印教程_ps怎么去水印?ps去水印的三种方法
  18. 笔记:关于Google Play这个应用市场app signing的坑
  19. android查ip地址,安卓手机查看IP地址的两种方法,  二、进入手机状态
  20. matlab分析总谐波失真THD,运放参数的详细解释和分析-part21,总谐波失真(THD)

热门文章

  1. 纪录一个C盘痕迹文件清理工具跟双开工具代码
  2. 曹操传水木清华版本,新剧本吕布传三国衰哥行袁绍新传刘备传等
  3. 游戏模型模糊高亮边缘效果实现shader
  4. 关于对荷兰大风车的起底
  5. cocos2d粒子系统--粒子编辑器Particle designer属性的介绍
  6. 数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)
  7. 从零开始的深度学习(一) 经典CNN网络 LeNet-5
  8. 使用《红孩儿工具箱》开发基于Cocos2d-x的《打地鼠》游戏
  9. SpringBoot加载spring.factories的价值
  10. java可以调用tts接口_使用微信语音合成接口(TTS)