PDF转换成图片(Java pdfbox实现)
pdf转成图片在java中主流的做法就是pdfbox和icepdf
然而我选择pdfbox
废话不多说上代码
引入依赖
<!--pdfbox-->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.13</version>
</dependency>
导出工具类
/**
* pdf操作工具类
* @author chao11.lei
*/
public class PdfUtils {
//经过测试,dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
public static final float DEFAULT_DPI = 144;
//默认转换的图片格式为jpg
public static final String DEFAULT_FORMAT = "jpg";
public final static Logger logger = LoggerFactory.getLogger(PdfUtils.class);
private static final String PROPERTY_KEY = "sun.java2d.cmm";
private static final String PROPERTY_VALUE = "sun.java2d.cmm.kcms.KcmsServiceProvider";
/**
* pdf转图片
*
* @param pdfPath PDF路径
* @return 图片路径
*/
public static void pdfToImage(String pdfPath, String imgPath) {
try {
logger.debug(">>处理开始");
System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
//图像合并使用参数
// 总宽度
int width = 0;
// 保存一张图片中的RGB数据
int[] singleImgRGB;
int shiftHeight = 0;
//保存每张图片的像素值
BufferedImage imageResult = null;
File pdfFile = new File(pdfPath);
//利用PdfBox生成图像
PDDocument pdDocument = PDDocument.load(pdfFile);
PDFRenderer renderer = new PDFRenderer(pdDocument);
//生成目录
String fileRealName = pdfFile.getName().replace(".pdf","");
File fileDir = new File(imgPath + "/" +fileRealName);
if(!fileDir.exists()) {
fileDir.mkdirs();
}
//循环每个页码
for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
//计算高度和偏移量
//使用第一张图片宽度;
width = imageWidth;
//保存每页图片的像素值
imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
// 写入流中
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
// 写图片
ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
if(i%10==0||i+1==len) {
logger.debug("处理进度:{}/{}", i + 1, len);
}
}
pdDocument.close();
logger.debug("处理结束>>");
} catch (Exception e) {
logger.error("PDF转图片失败:{}",e);
e.printStackTrace();
}
}
public static void pdfToImage(File pdfFile, String imgPath) {
try {
logger.debug(">>处理开始");
System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
//图像合并使用参数
// 总宽度
int width = 0;
// 保存一张图片中的RGB数据
int[] singleImgRGB;
int shiftHeight = 0;
//保存每张图片的像素值
BufferedImage imageResult = null;
//利用PdfBox生成图像
PDDocument pdDocument = PDDocument.load(pdfFile);
PDFRenderer renderer = new PDFRenderer(pdDocument);
//生成目录
String fileRealName = pdfFile.getName().replace(".pdf","");
File fileDir = new File(imgPath + "/" +fileRealName);
if(!fileDir.exists()) {
fileDir.mkdirs();
}
//循环每个页码
for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
//计算高度和偏移量
//使用第一张图片宽度;
width = imageWidth;
//保存每页图片的像素值
imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
// 写入流中
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
// 写图片
ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
if(i%10==0||i+1==len) {
logger.debug("处理进度:{}/{}", i + 1, len);
}
}
pdDocument.close();
logger.debug("处理结束>>");
} catch (Exception e) {
logger.error("PDF转图片失败:{}",e);
e.printStackTrace();
}
}
public static void pdfToImage(InputStream pdfFileInputStream, String fileName,String imgPath) {
try {
logger.debug(">>处理开始");
System.setProperty(PROPERTY_KEY, PROPERTY_VALUE);
//图像合并使用参数
// 总宽度
int width = 0;
// 保存一张图片中的RGB数据
int[] singleImgRGB;
int shiftHeight = 0;
//保存每张图片的像素值
BufferedImage imageResult = null;
//利用PdfBox生成图像
PDDocument pdDocument = PDDocument.load(pdfFileInputStream);
PDFRenderer renderer = new PDFRenderer(pdDocument);
//生成目录
String fileRealName = fileName.replace(".pdf","");
File fileDir = new File(imgPath + "/" +fileRealName);
if(!fileDir.exists()) {
fileDir.mkdirs();
}
//循环每个页码
for (int i = 0, len = pdDocument.getNumberOfPages(); i < len; i++) {
BufferedImage image = renderer.renderImageWithDPI(i, DEFAULT_DPI, ImageType.RGB);
int imageHeight = image.getHeight();
int imageWidth = image.getWidth();
//计算高度和偏移量
//使用第一张图片宽度;
width = imageWidth;
//保存每页图片的像素值
imageResult = new BufferedImage(width, imageHeight , BufferedImage.TYPE_INT_RGB);
singleImgRGB = image.getRGB(0, 0, width, imageHeight, null, 0, width);
// 写入流中
imageResult.setRGB(0, shiftHeight, width, imageHeight, singleImgRGB, 0, width);
// 写图片
ImageIO.write(imageResult, DEFAULT_FORMAT, new File(imgPath +fileRealName+"/" +fileRealName + "_" + (i +1)+ ".jpg"));
if(i%10==0||i+1==len) {
logger.debug("处理进度:{}/{}", i + 1, len);
}
}
pdDocument.close();
logger.debug("处理结束>>");
} catch (Exception e) {
logger.error("PDF转图片失败:{}",e);
e.printStackTrace();
}
}
}
方法调试过很多次,绝对好用
支持多种方式转换
- 路径文件
- File文件对象
- 输入流
测试
@Test
void testPdfToImg() {
PdfUtils.pdfToImage("D:\\img\\test.pdf", "D:\\img\\");
}

这里我发现在部分pc上不存在STsong-light字体且不存在可替换字体就会有警告,同时导出的文件就会乱码。
这里我也没找到STsong-light 字体,但是我找到可以替换的字体 AdobeFangsongStd-Regular
这是adobe的一款仿宋字体
下载链接,我就不放在下载专栏,骗大家的c币啦
http://yun.dlblog.club/f/8f02d1b05cf04dc682bb/
本文介绍了一种使用Java将PDF文件转换为图片的方法,通过Apache PDFBox库实现,并提供了详细的代码示例。支持多种输入方式,包括文件路径、File对象及输入流。

1万+

被折叠的 条评论
为什么被折叠?



