java实现pdf黑白化 : pdf转图片、图片黑白化、图片转pdf

news/2024/11/6 19:22:00/

java实现pdf黑白化

  • 背景
  • 研究方向选择
  • 功能实现
    • 依赖
    • pdf转图片
    • 图片黑白化
    • 黑白化后的图片转pdf
    • 效果对比

背景

最近开发办公系统,客户需求中有要求能使用传真机发传真。遇到问题:硬件方面,传真机只能发特定的tif文件,于是系统需要把客户上传的文件转成pdf,然后用Ghostscript 命令把pdf转成符合传真机要求的tif。因为客户方属于政府部门,一般上传的文件都是红头文件,在pdf转tif文件后,生成的tif文件所有的红色字体都看不清。下面是我的解决思路。

研究方向选择

解决这个问题无外乎有两种解决思路。

  1. 将pdf原件黑白化
  2. pdf转tif时将彩色字体黑化

由于自己是一个小白,感觉第一种解决思路对自己来说还可能搞定,于是选择了走第一种思路去解决这个问题。
尝试过很多办法,比如:
1. 使用itext直接编辑pdf,识别pdf中彩色字体,设置字体颜色。
2. pdf转word,然后编辑word字体颜色,再把word转pdf。
3. pdf转html,编辑html替换collor为红色的属性值为黑色,html转pdf。
4. pdf转换为图片,图片黑白化,把图片转换为pdf。

前三种方法我尝试了,但是多多少少都存在一些问题,不能满足我的需求,最终使用第四种方法实现的。

功能实现

我是采用springBoot集成itextpdf、pdfbox及cssbox,分别实现了pdf转图片、图片黑白化、图片转pdf的功能,下面是具体的实现代码。

依赖

 		<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><dependency><groupId>net.sf.cssbox</groupId><artifactId>pdf2dom</artifactId><version>1.7</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.12</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.12</version></dependency>

pdf转图片

 /**** PDF文件转PNG图片,全部页数** @param PdfFilePath pdf完整路径* @param dirUrl 图片存放的文件夹* @param dpi dpi越大转换后越清晰,相对转换速度越慢* @return*/public static List<String> pdfToImage(String PdfFilePath, String dirUrl, int dpi) {File file = new File(PdfFilePath);PDDocument pdDocument = null;PDFRenderer renderer;PdfReader reader = null;try {int dot = file.getName().lastIndexOf('.');String imagePDFName = file.getName().substring(0, dot); // 获取pdf文件名String imgFolderPath = null;if (StringUtils.isNotBlank(dirUrl)) {imgFolderPath = dirUrl + "/" + imagePDFName;// 获取图片存放的文件夹路径} else {imgFolderPath = "D:/img" + "/" + imagePDFName;//设置默认路径}if (createDirectory(imgFolderPath)) {pdDocument = PDDocument.load(file);renderer = new PDFRenderer(pdDocument);/* dpi越大转换后越清晰,相对转换速度越慢 */reader = new PdfReader(PdfFilePath);int pages = reader.getNumberOfPages();StringBuffer imgFilePath = null;List<String> imgUrlList = new ArrayList<>();for (int i = 0; i < pages; i++) {String imgFilePathPrefix = imgFolderPath + "/" + imagePDFName;imgFilePath = new StringBuffer();imgFilePath.append(imgFilePathPrefix);imgFilePath.append("_");imgFilePath.append(String.valueOf(i + 1));imgFilePath.append(".png");File dstFile = new File(imgFilePath.toString());BufferedImage image = renderer.renderImageWithDPI(i, dpi);ImageIO.write(image, "png", dstFile);imgUrlList.add(imgFilePath.toString());}System.out.println("PDF文档转PNG图片成功!");return imgUrlList;} else {System.out.println("PDF文档转PNG图片失败:" + "创建" + imgFolderPath + "失败");return null;}} catch (IOException e) {e.printStackTrace();return null;}finally {if (reader != null){try {reader.close();} catch (Exception e){e.printStackTrace();}if (pdDocument != null){try {pdDocument.close();} catch (Exception e){e.printStackTrace();}}}}}private static boolean createDirectory(String folder) {File dir = new File(folder);if (dir.exists()) {return true;} else {return dir.mkdirs();}}

图片黑白化

 public static void changeImg(List<String> imgUrlList) {try {if (imgUrlList != null && imgUrlList.size() > 0){for (String imgUrl : imgUrlList){File img = new File(imgUrl);java.awt.Image image = ImageIO.read(img);int srcH = image.getHeight(null);int srcW = image.getWidth(null);BufferedImage bufferedImage = new BufferedImage(srcW, srcH,BufferedImage.TYPE_3BYTE_BGR);bufferedImage.getGraphics().drawImage(image, 0,0, srcW, srcH, null);bufferedImage=new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY),null).filter (bufferedImage,null);FileOutputStream fos = new FileOutputStream(img);JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fos);encoder.encode(bufferedImage);fos.close();}}} catch (IOException e) {e.printStackTrace();throw new IllegalStateException("图片转换出错!", e);}}

黑白化后的图片转pdf

 public static String imgToPdf(List<String> imageUrllist,String dirUrl,String PDFName) {try {String pdfUrl = null;if (StringUtils.isNotBlank(dirUrl)){pdfUrl = dirUrl + "/" + PDFName + "/" + PDFName + ".pdf";} else {pdfUrl = "D:/img" + "/" + PDFName + "/" + PDFName + ".pdf";}File file = img2Pdf(imageUrllist, pdfUrl);//生成pdffile.createNewFile();return pdfUrl;} catch (IOException e) {e.printStackTrace();}return null;}public static File img2Pdf(List<String> imageUrllist, String mOutputPdfFileName) {Document doc = new Document(PageSize.A4, 20, 20, 0, 20); //new一个pdf文档try {mOutputPdfFileName = mOutputPdfFileName;PdfWriter.getInstance(doc, new FileOutputStream(mOutputPdfFileName)); //pdf写入doc.open();//打开文档for (int i = 0; i < imageUrllist.size(); i++) {  //循环图片List,将图片加入到pdf中doc.newPage();  //在pdf创建一页com.itextpdf.text.Image png1 = com.itextpdf.text.Image.getInstance(imageUrllist.get(i)); //通过文件路径获取imagefloat heigth = png1.getHeight();float width = png1.getWidth();int percent = getPercent2(heigth, width);png1.setAlignment(com.itextpdf.text.Image.MIDDLE);png1.scalePercent(percent+3);// 表示是原来图像的比例;doc.add(png1);}doc.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}File mOutputPdfFile = new File(mOutputPdfFileName);  //输出流if (!mOutputPdfFile.exists()) {mOutputPdfFile.deleteOnExit();return null;}return mOutputPdfFile; //返回文件输出流}public static int getPercent2(float h, float w) {int p = 0;float p2 = 0.0f;p2 = 530 / w * 100;p = Math.round(p2);return p;}

效果对比

原pdf

黑化后pdf

黑化后的效果还是很理想的,基本能解决我的问题。
本人 小白一枚、记录下我的第一篇博客····


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

相关文章

传真机(Fax)

傳真 傳真&#xff08;英語&#xff1a;&#xff0c;全名称为&#xff0c;源自拉丁文“”&#xff0c;意为“製造相似”&#xff09;是一種用以傳送文件複印本的電訊技術&#xff1b;而傳真機就是負責傳送這些文件的機器。隨著時代的演進&#xff0c;傳真的使用率持續減少。 常…

nginx常用命令以及安装

目录 前言&#xff1a; 安装&#xff1a; 常用命令&#xff1a; 前言&#xff1a; Nginx的设计理念是高性能、稳定性、开放性和易用性。它的并发能力优秀&#xff0c;可以处理数万个并发连接&#xff0c;并且占用较少的资源。此外&#xff0c;Nginx支持热部署&#xff0c;即…

北京与洛杉矶时差16小时,飞机飞行时间是12小时40分钟。请输入从洛杉矶起飞的日期与时间,计算出到达北京的日期与时间。

不考虑跨月跨年的情况&#xff0c;输入的日期号数不大于28&#xff0c;比如&#xff0c;28号21点40分起飞&#xff0c;30号2点20分到达。 【输入形式】输入起飞日期号&#xff08;天数&#xff09;&#xff0c;与起飞时间 【输出形式】输出到达的日期号与时间&#xff0c;飞机…

Linux —— 进程管理

一&#xff0c;进程概念 进程是正在执行的程序或命令&#xff0c;每个进程都是一个运行的实体或程序的执行实例&#xff0c;有自己的地址空间&#xff0c;并占用一定系统资源&#xff1b;从内核视角来看&#xff0c;是担当分配系统资源&#xff08;CPU时间、内存&#xff09;的…

HNU-操作系统OS-学习感悟

初次接触如此底层的计算机基础课程&#xff0c;我还是很不适应的。 教材用的这本书&#xff0c;实验用的清华大学的ucore实验 好在应试水平没有丢。最后总评94/100。 下面仅从应试角度谈一谈学习的理解 总领 HNU的OS课程平时分给的比较模糊&#xff0c;大致由 作业实验验…

物联网相关

一、应用领域 智能家居、智慧交通、智能医疗、智能电网、智能物流、智能农业、智能电力、智能安防、智慧城市、智能汽车、智能建筑、智能水务、商业智能、智能工业、平安城市 二、应用案例 1、物联网传感器产品已率先在上海浦东国际机场防入侵系统中得到应用。机场防入侵系统…

航空三字代码表_航空运输三字代码表

国内城市三字代码表 注&#xff1a;此表仅供参考 城市代码城市代码城市代码城市代码A阿勒泰AAT湖州HZW泸州LZO太原TYN 兴义ACX淮阴HYY连云港LYG天津TSN 百色AEB淮南HNN梁平LIA铜仁TEN 安康AKA海宁HNW罗定LDG黄山/屯溪TXN 阿克苏AKU上海虹桥机场HQG龙口LKW U乌鲁木齐URC 鞍山AOG…

中国第21批援赞比亚军医组凯旋

军医组凯旋。 李小波 摄 军医组凯旋。 李小波 摄 中新网上海1月18日电 (黄小春 罗微全)18日下午&#xff0c;圆满完成医疗援助任务的中国第21批援赞比亚军医组11名队员&#xff0c;搭乘阿联酋航空EK302次航班降落在上海浦东机场&#xff0c;顺利返回祖国。 陆伟医生为孔子学院…