PDF转换成图片(Java pdfbox实现 附中文乱码解决方案)

news/2024/11/30 2:42:26/

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/


http://www.ppmy.cn/news/363322.html

相关文章

苹果IOS 微信浏览器预览PDF乱码 解决方案

在此之前&#xff0c;此功能的实现是用户点击一个url&#xff0c;服务器返回一个二进制流&#xff0c;浏览器下载后是一个PDF文件&#xff0c;客户可以进行浏览。 此次收到了合作方的新要求&#xff0c;能够在微信中点击url &#xff0c;直接预览PDF中的内容。 第一版&…

iOS-关于解决WebView、WKWEbView打开pdf文件乱码问题

今天遇到了WebView打开pdf乱码的问题&#xff0c;百度了一下&#xff0c;遂找到了解决方法&#xff0c;在这记录一下&#xff0c;原贴地址 原贴整理了两种解决方法&#xff0c;我试了第二种没成功&#xff0c;也没搞懂是什么问题&#xff0c;下面就整理一下第一种解决方法。 …

java调用pdfbox转pdf文件为图片文件,有中文时在windows上正常,部署到linux下乱码

最近遇到了一个很头疼的问题&#xff0c;我们的项目移动端需要一个读pdf的功能&#xff0c;但是手机端开发人员说移动端是用jquerymobile做的&#xff0c;不能直接甩pdf文件过去(原因是pdf文件太大)&#xff0c;于是乎我们想到了2个解决方案。 第一个&#xff1a;把pdf转成htm…

基于51单片机的全自动智能洗衣机控制系统Proteus仿真(仿真+源码+全套资料)

资料编号&#xff1a;108 设计功能&#xff1a; 1、对水温实时显示 2、显示滚筒转速 3、显示运行倒计时 4、能通过按钮分别设置洗涤时间和脱水时间 5、运行过程为&#xff1a;加热——洗涤——脱水 具体功能请看下方演示视频 108-基于51单片机的全自动智能洗衣机控制系统Pro…

java生成pdf时汉字乱码,为□-(linux系统)

问题描述&#xff1a;Linux环境中Java生成pdf时&#xff0c;图片中的汉字位置都显示为方框&#xff0c;乱码、方框、问号 原因分析&#xff1a;经排查日志&#xff0c;发现是在生成的时候缺少对应的字体库 1&#xff1a;由于项目由原来的Windows系统换到了Linux系统&#xff0…

用pdfbox进行pdf转图片中文乱码,缺失字体

PDDocument pdDocument PDDocument.load(inputStreamByUrl); PDFRenderer pdfRenderer new PDFRenderer(pdDocument); BufferedImage bufferedImage pdfRenderer.renderImageWithDPI(i, 144F, ImageType.RGB); 使用pdfbox读取pdf转图片的时候&#xff0c;如果缺失字体&…

浏览器打开pdf乱码

前几天在测试项目的时候&#xff0c;无意间发现个bug——在下载pdf时如果选择打开则会出现乱码&#xff0c;然而保存pdf文件时却不会乱码。一开始&#xff0c;我以为是浏览器的设置问题&#xff0c;问了问度娘&#xff0c;说是没有ADOBE的缘故&#xff0c;于是乎&#xff0c;安…

pdf阅读器或知云文献阅读选中pdf文字乱码

pdf阅读器或知云文献阅读选中pdf文字乱码 使用知云翻译pdf的时候选中文字全是问号和乱码&#xff0c;其他的阅读器选中复制的文字也是乱码 原因分析&#xff1a; 文章是不可复制的&#xff0c;需要重新扫描和orc 解决方案&#xff1a; 使用的软件&#xff1a;Adobe acrobat pro…