业务说明:由于业务相关要求,对接第三方PDF文件转JPG之后上传服务器,同时还进行ocr识别。
看了一下CSDN上面的一些帖子,大部分都无法处理非标准的PDF文件,比如用打印机扫描的PDF文件可能是歪着的,就会转换图片失败。
前提:使用Ghostscript转换。需要先安装gs软件,然后将path: D:/gs/bin/gs9.23/bin/gswin32c 写入到gsPath配置文件中。后面进行调用。
依赖包:

 <dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-core</artifactId><version>4.1.0</version></dependency>

导入:

import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfReader;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.concurrent.CountDownLatch;1、核心方法 pdf2Image。logParam和caseOrderNo随便传值就好,id业务需求对图片上传服务器操作使用。private static final String GS_TEMP_FOLDER_NAME = "gstemp";    //生成pdf和图片文件的临时目录@Value("${gs.path}")private String gsPath;   //配置文件中gs的配置路径public void pdf2Image(byte[] pdfBytes, String logParam,String caseOrderNo,String id) throws Exception {//1. 创建临时目录,临时存储生成的图片数据String path = GS_TEMP_FOLDER_NAME + File.separator + UUID.randomUUID() + File.separator + UUID.randomUUID();File pdfFile = FileUtil.createFile(path, logParam);if (pdfFile == null) {throw new Exception("创建临时目录失败!");}//2. 将pdf字节流写入文件中try {FileUtils.writeByteArrayToFile(new File(path), pdfBytes);} catch (IOException e) {log.error("将pdf转成图片出现IOException. logParam = " + logParam, e);throw new Exception("将pdf转成图片出现异常!!");}//3. 将pdf转成图片,组拼返回体return pdf2Image(pdfFile, logParam,caseOrderNo,id);}
--------------------------------------------------------
private List<UploadFileDto> pdf2Image(File pdfFile, String logParam, String caseOrderNo,String id) throws Exception {long startTime = System.currentTimeMillis();List<UploadFileDto> imgList = new ArrayList<>();String imgPath = pdfFile.getParent();PdfReader pdfReader = null;try{pdfReader = new PdfReader(new FileInputStream(pdfFile));} catch (Exception e) {e.printStackTrace();throw new Exception("将pdf转成图片出现异常!");}int pageCount = pdfReader.getNumberOfPages();if (pageCount == 0) {throw new Exception("将pdf转成图片出现异常!");}Rectangle rectangle = pdfReader.getPageSize(1);float width = rectangle.getWidth();float height = rectangle.getHeight();String resolution = "";String downScaleFactor = "";//根据pdf的大小,之后对图片压缩if (width < 1487 && height < 2105) {resolution = "-r300";downScaleFactor = "-dDownScaleFactor=1";} else if (width < 2451 && height < 3508) {resolution = "-r300";downScaleFactor = "-dDownScaleFactor=2";} else if (width * 0.5 <= 2479 && height * 0.5 <= 3508) {resolution = "-r150";downScaleFactor = "-dDownScaleFactor=2";} else if (width * 0.4 <= 2479 && height * 0.4 <= 3508) {resolution = "-r120";downScaleFactor = "-dDownScaleFactor=3";} else {resolution = "-r72";downScaleFactor = "-dDownScaleFactor=3";}Map<String, String> param = new HashMap<>();param.put("resolution", resolution);param.put("downScaleFactor", downScaleFactor);log.info("获取到pdf总页数为... pageCount = {}, logParam = {}", pageCount, logParam);//2. 线程池CountDownLatch countDownLatch = new CountDownLatch(pageCount);for (int i = 1; i <= pageCount; i++) {final int j = i;
//如果是多页pdf可以用线程池,本业务单页pdf所以注释掉
//            imgThreadPool.execute(new Runnable() {//                @Override
//                public void run() {//图片文件File tempImage = new File(imgPath + File.separator + UUID.randomUUID().toString() + ".jpg");//拼接命令行参数String[] gsArgs = {gsPath, "-dNOPAUSE", "-dBATCH", "-dSAFER", "-sDEVICE=jpeg", "-sDisplayHandle=0", param.get("resolution"), param.get("downScaleFactor")};try {gsArgs = Arrays.copyOf(gsArgs, gsArgs.length + 4);// pdf路径参数 必须放在最后gsArgs[gsArgs.length - 1] = pdfFile.getAbsolutePath();// 设置需要处理的页码范围,一张一张的处理gsArgs[gsArgs.length - 4] = "-dFirstPage=" + (j);gsArgs[gsArgs.length - 3] = "-dLastPage=" + (j);gsArgs[gsArgs.length - 2] = "-sOutputFile=" + tempImage.getAbsolutePath();log.info("pdf2Image gsArgs is: {}", JSONObject.toJSONString(gsArgs));Process proc = new ProcessBuilder(gsArgs).redirectErrorStream(true).start();//读取进程的流while (proc.isAlive()) {List<String> output = IOUtils.readLines(proc.getInputStream());output.forEach((String line) -> log.info(line));}   // 线程等待,等待处理完毕int exitValue;if ((exitValue = proc.waitFor()) != 0) {log.error("pdf转为图片转换失败 gs进程返回错误码为: {}, logParam = {}", exitValue, logParam);return null;}//读取图片流byte[] imgByte = FileUtils.readFileToByteArray(tempImage);UploadFileDto fileDto = new UploadFileDto();fileDto.setFileType(FileTypeEnum.JPG.getType());fileDto.setFileStream(imgByte);fileDto.setSort(j);imgList.add(fileDto);//得到图片文件tempImage之后,根据各项目逻辑对图片进行相关操作//.................} catch (Exception e) {log.error("pdf转为图片转换出现特殊异常...logParam = " + logParam, e);} finally {log.debug("pdf转为图片 finally ===");countDownLatch.countDown();}}try {countDownLatch.await();} catch (InterruptedException e) {log.error("pdf转为图片时,出现InterruptedException...logParam = " + logParam, e);throw new Exception("将pdf转成图片出现异常!");}//删除文件夹以及文件FileUtil.deleteFileAndFolder(imgPath);return imgList;}

上诉代码有些地方书写解释比较麻烦,记录下给大家使用就好。

业务:pdf转图片问题(解决非标准pdf转图片空白问题)相关推荐

  1. linux下打印图片不显示出来的,为什么打印机打印不了图片_解决打印机打印不了图片的方法-系统城...

    在办公室上班的都会接触到打印机,大家在使用打印机会碰到打印不出图片的情况,为什么会这样呢?出现这种情况排除打印机驱动外,一般是由于打印机的设置不当造成的.针对此疑问,小编教你解决打印机打印不了图片的方 ...

  2. php外链图片转换,解决zblogPHP远程外链图片自动保存的办法

    使用zblogphp版的独立博客博主们可能没有在意,zblogphp存在一个小bug就是在博客没有启用远程图片附件自动保存到本地的情况下,编辑文章中使用的外链图片依然会被自动保存到本地(在附件管理中可 ...

  3. C#图片处理 解决左右镜像相反(旋转图片)

    /// <summary>/// aforge摄像框控件:捕捉识别绘制人脸框/// </summary>/// <param name="sender" ...

  4. canvas将上传的图片文件绘制一个空心圆并往里加个图片,解决canvas绘制jpeg,jpg图片背景变黑为题

    async handleGetFile(file) {if (file.size / 1024 / 1024 > 15) {this.$Message.error(`文件大小最大为15M`)re ...

  5. php怎么显示不了图片,php显示不了图片的解决办法,

    php显示不了图片的解决办法PHP不能显示图片的解决方案,Php不能显示图片,因为源代码中除了img输出还有其他输出.解决方法是在调用头之前取消任何输出. 推荐: <PHP视频教程> 具体 ...

  6. 解决word转PDF文件时图片位置改变和字体格式改变的问题

    解决word转PDF文件时图片位置改变和字体格式改变的问题 在写论文的时候,使用word编辑完文本后将其导出为PDF总是出现图片位置改变或者字体格式改变的问题,好不容易在word中编辑好的格式却不能在 ...

  7. matlab图片在word/wps中模糊解决方法,matlab图片转pdf后信息丢失解决方法

    在写论文的时候,不免需要把matlab的仿真图片贴在论文里,但是matlab图片另存为后就会降低像素,变得模糊,怎么才能让图片清晰呢? 可以按下面步骤试试: (1)matlab跑出仿真图后,在菜单栏依 ...

  8. c++类对象的例子(非标准语法;请使用 ““ 来创建指向成员的指针,如何解决?)

    非标准语法:请使用 "&" 来创建指向成员的指针,如何解决? 在main.cpp中有问题 Game.cpp......#include "Game.h" ...

  9. android ppt 转图片显示不全,PPT转PDF图片显示不全怎么办?如何完美解决PPT转PDF文件?...

    原标题:PPT转PDF图片显示不全怎么办?如何完美解决PPT转PDF文件? 记得以前上学的时候,我们班级每周都会做一次小组作业汇报.每一个小组都会准备一个PPT来进行展示演讲,可是有的同学的PPT在老 ...

最新文章

  1. LeetCode简单题之Excel 表中某个范围内的单元格
  2. PHP session回收机制
  3. 快速入门linux系统的iptables防火墙 1 本机与外界的基本通信管理
  4. 云间来客 --- Java 目录大纲
  5. android5.0(Lollipop) BLE Peripheral牛刀小试
  6. 如何找到ABAP里被动态调用的update function module
  7. 漫画:什么是机器学习
  8. php 验证码一直不对,ThinkPHP验证码老是出错怎么办
  9. 如何将外部的obj模型导入OpenGL
  10. 一文概述深度学习中的正则化(含Python代码)
  11. java三大框架介绍
  12. 网络信息安全:数字签名
  13. 计算机word打开,电脑word打不开怎么办
  14. PCA与2DPCA及2D-2DPCA零基础理解(下)
  15. 海康威视官方安装包(提供64位安装包)
  16. 1230k倍区间,关于cnt[0]赋值为1的解释
  17. ChatGPT版Office(Word/Excel/PPT)来了
  18. 用纯css模拟下雪的效果
  19. 极简html4网页布局,浅淡极简的网页设计:少即多
  20. cordova app 监听物理返回键

热门文章

  1. 解决了,佳能R6相机DAT/MP4视频文件修复卡顿无声问题
  2. swift学习日志—— Log日志
  3. java和易语言对比_国外流行排行榜编程语言和易语言相比较的优势和劣势
  4. 【StringBuffer】简单理解
  5. Resource file and Source file
  6. 【树莓派】一、新坑入门-购买篇、基础配置篇
  7. 外国人眼里的李子柒难道不一样? | Alfred数据室
  8. ntoskrnl.exe损坏或丢失的解决方案
  9. linux下socket编程带来的尴尬
  10. python招聘现状-python招聘现状