pdfbox将多页pdf转成多张长图片
(pdfbox将pdf转成图片(jpg或者png)
- 首先需要说明的几点事情
- 功能由来
- 引入jar包
- 下面贴上代码
- 关于产生2种报错信息的说明
- 写在最后
首先需要说明的几点事情
- 本文是基于pdfbox2.0以上版本实现的
- 主要实现功能是将多页的pdf文件转成1张png或者jpg图片,或者多张jpg图片
- 本文是借鉴将多页pdf转成1张长图片的方法修改
功能由来
最近项目要求能够实现office(word, excel,ppt)等的在线预览功能,思路是分2步走
- office组件转pdf,即是先将office组件转成pdf进行上传
- pdf转成长图片,即是将pdf转成长图片的形式,便于操作
引入jar包
- 基于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>
下面贴上代码
- 这是将多页(至少超过50)pdf转换为多张长图片的代码
- 至于转成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种报错信息的说明
- javax.imageio.IIOException: Maximum supported image dimension is 65500 piexls
产生这种错误的原因是我想将多页的pdf转成1张长图片(jpg格式会有,而png则不会)所致,经本人多次尝试,这个上限大概在50-60张之间,超过的话,基本100%会报这个错 - 数组下标越界异常
产生这个错误的原因是因为上面的代码种,在写完1张图片后,未将shiftHeight置为0所致
写在最后
- 抱歉是忘了参考哪位大神的了,如有雷同,请大神联系我;小弟一定加上你的连接
- 欢迎大家有问题在下面评论哈,相互交流,一起成长
pdfbox将多页pdf转成多张长图片相关推荐
- 在windows平台下php使用imagick库把pdf转换成(合并)图片
在windows平台下php使用imagick库把pdf转换成(合并)图片 开发背景 上传的word文档需要转换成图片,在网上找了资料,主要是先转换成pdf: 1. 在windows下用com组件加上 ...
- 为什么PDF转成Word后是图片,怎么才能修改?
众所周知,PDF文件是很难被直接修改,最多也就是局部性的修改,而且限制还颇多.因为我们通常会想到将PDF转成Word,再进行修改,现在有很多工具,确实也有很好的转换效果,如果PDF页面不是很复杂的话, ...
- pdf转成word | ppt | jpg图片,免费一键转换教程
我不允许真的还有人不知道如何免费将pdf转成 ppt.word 或者 jpg图片! 职场小伙伴是不是会经常遇到pdf怎么转成word,pdf怎么转成word,pdf怎么jpg图片等问题?别再为pdf转 ...
- Python 实现 GIF 动态图片分解 , 多帧动态图分解成多张静态图片
文章目录 需求 实现 参考 需求 有时候你看到一张动态图片,其中的一个画面你觉得很不错,想从中提取出来.例如以下这张由多个漂亮小姐姐组成的 GIF 动态图: 实现 GIF 动态图片是由多张静态图片组合 ...
- Java工具类pdfbox将多个pdf合并成一个pdf。
引入maven依赖: <!-- 将两个或多个单独的PDF文件合并成一个PDF文件--><dependency><groupId>org.apache.pdfbox& ...
- 利用ffmpeg将mp4视频转换成多张jpg图片
分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_video //分离视频流 ffmpeg -i input_file -acodec ...
- 将一张图片分割成多张小图片 Python3
- 用PS怎样把一张图片切割成几张小图片?
1.打开PS,点击左上角的"文件",在文件中,点击"打开",先把图片保存在电脑上,然后找到图片,点击打开. 2.打开图片后,右击左侧工具栏中的"剪裁工 ...
- 怎么把做好的ps保存成图片_PS怎么把一张图片切片保存成多张png图片?
做过网页设计的朋友,想必一定用过ps进行切图,有时候会用到保存透明背景图片,那么就要用到png图片格式,下面就来教教大家怎么切出png图标! 1.首先我们会用到一张ico图标素材(如下一张作为实验案例 ...
最新文章
- JavsScript--on与addEventListener的使用与两者的不同
- UA MATH636 信息论7 高斯信道简介
- winform调用webservice增删查改_教你分别用数据库与云函数实现“增删查改”
- 在新浪潮中,服务教育是你的竞争利器
- GHOST系统时出现“A:\GHOSTERR.TXT”的解决方法
- insert ... on duplicate key update产生death lock死锁原理
- 长见识:你真的知道C语言里extern quot;Cquot; 的作用吗?
- Linux管理磁盘配额
- ecshop nginx php-fpm,ecshop在nginx下配置常见问题
- python用一行代码画个迷宫_用 Python 制作一个迷宫游戏
- 利用NAS寻找最佳GAN:AutoGAN架构搜索方案专为GAN打造
- 质疑“扩版=质量下降”——以《中国农学通报》和《安徽农业科学》为例
- VS2010 + OpenCL 1.1 @ Windows 7 + AMD HD6870
- std string 编码_【星云测试】Wings企业级单元测试自动编码引擎白皮书
- 驾考你准备好了吗 之 交通标志、标线篇
- C#二次开发金橙子MarkEzd.dll激光打标机
- ps去水印教程_ps怎么去水印?ps去水印的三种方法
- 笔记:关于Google Play这个应用市场app signing的坑
- android查ip地址,安卓手机查看IP地址的两种方法, 二、进入手机状态
- matlab分析总谐波失真THD,运放参数的详细解释和分析-part21,总谐波失真(THD)