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越高图片体积越大,一般电脑显示分辨率为96public static final float DEFAULT_DPI = 144;//默认转换的图片格式为jpgpublic 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文件对象
- 输入流
测试
@Testvoid testPdfToImg() {PdfUtils.pdfToImage("D:\\img\\test.pdf", "D:\\img\\");}
这里我发现在部分pc上不存在STsong-light字体且不存在可替换字体就会有警告,同时导出的文件就会乱码。
这里我也没找到STsong-light 字体,但是我找到可以替换的字体 AdobeFangsongStd-Regular
这是adobe的一款仿宋字体
下载链接,我就不放在下载专栏,骗大家的c币啦
http://yun.dlblog.club/f/8f02d1b05cf04dc682bb/