(pdfbox将pdf转成图片(jpg或者png)
首先需要说明的几点事情
- 本文是基于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所致
写在最后
- 抱歉是忘了参考哪位大神的了,如有雷同,请大神联系我;小弟一定加上你的连接
- 欢迎大家有问题在下面评论哈,相互交流,一起成长