package com;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
import org.apache.pdfbox.tools.imageio.ImageIOUtil;
public class PDFUtil {
/**
*
* @param pdfFile
* PDF文件
* @param imgPath
* 图片存储路径
* @param imgName
* 图片存储文件名
* @param imgType
* 图片存储类型
* @param dpi
* 转换精度,建议100左右
* @return 是否成功
* @throws IOException
*/
public static boolean PDFToImg(File pdfFile, String imgPath, String imgName, String imgType, int dpi)
throws IOException {
String color = "rgb";
int startPage = 1;
// 目前只支持转换一页PDF,endPage限制最多转换页数
// 如果有多页,需要调整文件名逻辑
int endPage = 1;
float cropBoxLowerLeftX = 0.0F;
float cropBoxLowerLeftY = 0.0F;
float cropBoxUpperRightX = 0.0F;
float cropBoxUpperRightY = 0.0F;
PDDocument pdDocument = null;
try {
pdDocument = PDDocument.load(pdfFile);
ImageType imageType = null;
if ("bilevel".equalsIgnoreCase(color)) {
imageType = ImageType.BINARY;
} else if ("gray".equalsIgnoreCase(color)) {
imageType = ImageType.GRAY;
} else if ("rgb".equalsIgnoreCase(color)) {
imageType = ImageType.RGB;
} else if ("rgba".equalsIgnoreCase(color)) {
imageType = ImageType.ARGB;
}
if (imageType == null) {
return false;
}
if (cropBoxLowerLeftX != 0.0F || cropBoxLowerLeftY != 0.0F || cropBoxUpperRightX != 0.0F
|| cropBoxUpperRightY != 0.0F) {
changeCropBox(pdDocument, cropBoxLowerLeftX, cropBoxLowerLeftY, cropBoxUpperRightX, cropBoxUpperRightY);
}
boolean success = true;
endPage = Math.min(endPage, pdDocument.getNumberOfPages());
PDFRenderer renderer = new PDFRenderer(pdDocument);
// 目前只支持转换一页PDF
// 如果有多页,需要调整文件名逻辑
for (int endTime = startPage - 1; endTime < endPage; ++endTime) {
BufferedImage image = renderer.renderImageWithDPI(endTime, (float) dpi, imageType);
String duration = imgPath + imgName + "." + imgType;
System.out.println("PDF图片生成路径" + duration);
success &= ImageIOUtil.writeImage(image, duration, dpi);
}
if (!success) {
System.out.println("Error: no writer found for image format \'" + imgType + "\'");
return false;
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (pdDocument != null) {
pdDocument.close();
}
}
return true;
}
private static void changeCropBox(PDDocument document, float a, float b, float c, float d) {
Iterator<PDPage> i$ = document.getPages().iterator();
while (i$.hasNext()) {
PDPage page = (PDPage) i$.next();
PDRectangle rectangle = new PDRectangle();
rectangle.setLowerLeftX(a);
rectangle.setLowerLeftY(b);
rectangle.setUpperRightX(c);
rectangle.setUpperRightY(d);
page.setCropBox(rectangle);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
项目中遇到此需求,网上搜罗各种资料,都没有100%解决问题,要么丢字符,要么格式错乱,要么乱码,潜心攻克几天,终于找到完美方案,现分享给各位同仁; 基于apache pdfbox库实现Java PDF转图片,带源码和pom文件; 开发环境导入maven工程,PdfToImg为测试类,修改其中test.pdf和test.png的路径即可运行; PDFUtil为独立工具类,可放置任何工程中运行。 如果在linux中运行出现乱码,说明linux未安装中文字体,安装一个中文字体即可。
资源推荐
资源详情
资源评论
收起资源包目录
pdftoimg.zip (6个子文件)
pom.xml 2KB
src
test
java
main
resources
test
application.yml 1KB
dev
application.yml 1003B
release
application.yml 1KB
java
com
PDFUtil.java 3KB
PdfToImg.java 287B
webapp
共 6 条
- 1
资源评论
争鸣2020
- 粉丝: 14
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功