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;}

效果对比

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

java实现pdf黑白化 : pdf转图片、图片黑白化、图片转pdf相关推荐

  1. java图片转换pdf_Java实现图片转换PDF文件的示例代码

    最近因为一些事情,需要将一张简单的图片转换为PDF的文件格式,在网上找了一些工具,但是这些工具不是需要注册账号,就是需要下载软件. 而对于只是转换一张图片的情况下,这些操作显然是非常繁琐的,所以作者就 ...

  2. java pdf替换内容_Java添加、提取、替换和删除PDF图片

    (一)简介 PDF在大多操作平台都能以高质量被使用,非常适合将有用的信息存档和分享.接下来这篇文章将介绍通过Java添加.提取.删除和替换PDF文档中的图片.文章大概结构如下: 添加图片到PDF 提取 ...

  3. word转换成pdf,包括导航目录和图片不变黑

    1.word转换成pdf,包括导航目录和图片不变黑: 有些时候将word转换成pdf,我们会发现生成的文件要么不带导航目录,要么就是图片显示有问题,比如变黑.变黑是因为某些图片在作图时修改了透明度,因 ...

  4. Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式文件

    这篇文章介绍如何在Java应用程序中将PDF转换为HTML.Word.图片.SVG.XPS.PDF/A等格式. 本文所使用的PDF组件: Free Spire.PDF for Java Free Sp ...

  5. 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 ...

  6. java操作PDF文件,可支持分页、合并、图片转PDF等

    java操作PDF,有一个很好用的工具--pdfbox.只需要引入依赖,即可使用. <dependency><groupId>org.apache.pdfbox</gro ...

  7. 使用java iTest实现PDF大文件压缩——将文件过大的图片PDF文件压缩成小一些的图片PDF文件

    一.需求 项目中需要将文件大小过大的PDF文件,压缩成小PDF文件.通过iText的API,可以实现此需求.在保证文件不失真的前提下,将PDF大文件压缩成小文件. 二.代码 import com.it ...

  8. java 生成纯色图片_Java 给PDF文档设置背景色(纯色、背景图片)

    import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import java.awt.*; public class ...

  9. Pdf 插入图片 | 指定位置插入图片 不改变原格式 直接操作 pdf

    // 获得pdf页数 int pdfPage = DocUtil.getPdfPage(filePath); //指定将和 图片拼接的 PDF// 获取第一页宽和高 PdfReader pdfread ...

  10. 使用itext7在PDF文件中的指定文字位置添加电子签名图片技术记录

    使用itext7在PDF文件中的指定文字位置添加电子签名图片 文章目录 使用itext7在PDF文件中的指定文字位置添加电子签名图片 一.技术使用背景 二.使用步骤 1.引入依赖 2.具体代码 2.控 ...

最新文章

  1. JAVA中 @Override 的作用
  2. 外卖流量红利期已过:正从补贴战进入AI赛道
  3. pthread_mutex_lock用法
  4. Hibernate数据保存操作方法的原理对比
  5. 使用VS2013在WIN8.1上运行gaclib的hello world
  6. 主流开源开发者工具落地阿里云,进一步提升开发者体验
  7. datetime(0) NULL DEFAULT NULL报错
  8. Java String源码解析
  9. Java基础:Collections集合、Map集合综合案例 —— 斗地主
  10. 常用设计模式之单例模式
  11. ArcGIS的ArcMap的Mxd格式符号转换为Geoserver style的sld格式
  12. 命令提示符打不开python_Windows-Python在命令提示符下不起作用?
  13. 在HMM中,如果已知观察序列和产生观察序列的状态序列,那么可用以下哪种方法直接进行参数估计
  14. 使用three.js做一个网页的相册动画
  15. 今年很火的AI绘画怎么玩
  16. 模电数电微机接口微机应用实验设备QY-MS535F
  17. java 代码的规范
  18. 如何用VScode 进行调试
  19. json对象遍历输出key和value
  20. 三级网络技术考前复习

热门文章

  1. logistic回归分析优点_SPSS统计分析全解析Logistic回归(逻辑回归)
  2. 动手编写操作系统(1):初识Bochs
  3. KVM虚拟化技术浅析
  4. flask基于保利威做视频认证
  5. tomcat未自动解压war包原因分析
  6. 动手实验:使用 jstat 摸清线上系统的JVM运行状况
  7. knockoutjs
  8. 手机验证码登录 添加 区号,国家,国家简写,国家中文名称,国旗展示
  9. 同轴馈电微带天线(一)
  10. html5使用mescroll