java实现pdf黑白化 : pdf转图片、图片黑白化、图片转pdf
java实现pdf黑白化
- 背景
- 研究方向选择
- 功能实现
- 依赖
- pdf转图片
- 图片黑白化
- 黑白化后的图片转pdf
- 效果对比
背景
最近开发办公系统,客户需求中有要求能使用传真机发传真。遇到问题:硬件方面,传真机只能发特定的tif文件,于是系统需要把客户上传的文件转成pdf,然后用Ghostscript 命令把pdf转成符合传真机要求的tif。因为客户方属于政府部门,一般上传的文件都是红头文件,在pdf转tif文件后,生成的tif文件所有的红色字体都看不清。下面是我的解决思路。
研究方向选择
解决这个问题无外乎有两种解决思路。
- 将pdf原件黑白化;
- 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;}
效果对比
黑化后的效果还是很理想的,基本能解决我的问题。
本人 小白一枚、记录下我的第一篇博客····
java实现pdf黑白化 : pdf转图片、图片黑白化、图片转pdf相关推荐
- java图片转换pdf_Java实现图片转换PDF文件的示例代码
最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而对于只是转换一张图片的情况下,这些操作显然是非常繁琐的,所以作者就 ...
- java pdf替换内容_Java添加、提取、替换和删除PDF图片
(一)简介 PDF在大多操作平台都能以高质量被使用,非常适合将有用的信息存档和分享.接下来这篇文章将介绍通过Java添加.提取.删除和替换PDF文档中的图片.文章大概结构如下: 添加图片到PDF 提取 ...
- word转换成pdf,包括导航目录和图片不变黑
1.word转换成pdf,包括导航目录和图片不变黑: 有些时候将word转换成pdf,我们会发现生成的文件要么不带导航目录,要么就是图片显示有问题,比如变黑.变黑是因为某些图片在作图时修改了透明度,因 ...
- Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式文件
这篇文章介绍如何在Java应用程序中将PDF转换为HTML.Word.图片.SVG.XPS.PDF/A等格式. 本文所使用的PDF组件: Free Spire.PDF for Java Free Sp ...
- java svg 转pdf_Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式
这篇文章介绍如何在Java应用程序中将PDF转换为HTML.Word.图片.SVG.XPS.PDF/A等格式. 本文所使用的PDF组件: Free Spire.PDF for Java Free Sp ...
- java操作PDF文件,可支持分页、合并、图片转PDF等
java操作PDF,有一个很好用的工具--pdfbox.只需要引入依赖,即可使用. <dependency><groupId>org.apache.pdfbox</gro ...
- 使用java iTest实现PDF大文件压缩——将文件过大的图片PDF文件压缩成小一些的图片PDF文件
一.需求 项目中需要将文件大小过大的PDF文件,压缩成小PDF文件.通过iText的API,可以实现此需求.在保证文件不失真的前提下,将PDF大文件压缩成小文件. 二.代码 import com.it ...
- java 生成纯色图片_Java 给PDF文档设置背景色(纯色、背景图片)
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import java.awt.*; public class ...
- Pdf 插入图片 | 指定位置插入图片 不改变原格式 直接操作 pdf
// 获得pdf页数 int pdfPage = DocUtil.getPdfPage(filePath); //指定将和 图片拼接的 PDF// 获取第一页宽和高 PdfReader pdfread ...
- 使用itext7在PDF文件中的指定文字位置添加电子签名图片技术记录
使用itext7在PDF文件中的指定文字位置添加电子签名图片 文章目录 使用itext7在PDF文件中的指定文字位置添加电子签名图片 一.技术使用背景 二.使用步骤 1.引入依赖 2.具体代码 2.控 ...
最新文章
- JAVA中 @Override 的作用
- 外卖流量红利期已过:正从补贴战进入AI赛道
- pthread_mutex_lock用法
- Hibernate数据保存操作方法的原理对比
- 使用VS2013在WIN8.1上运行gaclib的hello world
- 主流开源开发者工具落地阿里云,进一步提升开发者体验
- datetime(0) NULL DEFAULT NULL报错
- Java String源码解析
- Java基础:Collections集合、Map集合综合案例 —— 斗地主
- 常用设计模式之单例模式
- ArcGIS的ArcMap的Mxd格式符号转换为Geoserver style的sld格式
- 命令提示符打不开python_Windows-Python在命令提示符下不起作用?
- 在HMM中,如果已知观察序列和产生观察序列的状态序列,那么可用以下哪种方法直接进行参数估计
- 使用three.js做一个网页的相册动画
- 今年很火的AI绘画怎么玩
- 模电数电微机接口微机应用实验设备QY-MS535F
- java 代码的规范
- 如何用VScode 进行调试
- json对象遍历输出key和value
- 三级网络技术考前复习