使用iText对pdf中查找关键字坐标进行填充

1.pom文件引入以下依赖

     <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.6</version></dependency><!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

2.新建敏感信息实体类


public class TextLineMode {public static final float defaultHeight = 14;public static final float fixHeight = 4;private int curPage = 1;private float height = 0;private float width = 0;private float x = 0;private float y = 0;public int getCurPage() {return curPage;}public void setCurPage(int curPage) {this.curPage = curPage;}public float getHeight() {return height;}public void setHeight(float height) {this.height = height;}public float getWidth() {return width;}public void setWidth(float width) {this.width = width;}public float getX() {return x;}public void setX(float x) {this.x = x;}public float getY() {return y;}public void setY(float y) {this.y = y;}}

3.对关键词进行查找并进行打码(ITextPdfUtil)

 import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;import com.example.demo.Listener.TextLineMode;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;public class ITextPdfUtil {
/*
* 参数说明:
* src:原始文件
* dest:打码文件
* keywords:敏感词查找
* */public boolean manipulatePdf(String src, String dest, List<String> keywords) throws Exception {PdfReader pdfReader = null;PdfStamper stamper = null;try {pdfReader = new PdfReader(src);stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));List<TextLineMode> list = renderText(pdfReader, keywords);if (list != null) {for (int i = 0; i < list.size(); i++) {TextLineMode mode = list.get(i);PdfContentByte canvas = stamper.getOverContent(mode.getCurPage());//初始阶段完成 开始替换canvas.saveState();//黑色背景覆盖canvas.setColorFill(BaseColor.LIGHT_GRAY);// canvas.setColorFill(BaseColor.BLUE);// 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:canvas.rectangle(mode.getX() - 2 , mode.getY(),mode.getWidth()+2 , mode.getHeight());
//                     canvas.rectangle(mode.getX() - 1, mode.getY(),
//                     mode.getWidth() + 2, mode.getHeight());//定位// canvas.rectangle(0, mode.getY(), 10000, mode.getHeight());//填充canvas.fill();//还原状态canvas.restoreState();}}return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {if (stamper != null)stamper.close();if (pdfReader != null)pdfReader.close();}return false;}/*根据位置进行添加文本* src : 原打码文件的位置* dest :生成新打码文件的位置* */public boolean manipulatePdfAdd(String src,String dest) throws Exception {BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);PdfReader pdfReader = null;PdfStamper stamper = null;try {pdfReader = new PdfReader(src);stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));PdfContentByte canvas = stamper.getOverContent(1);//初始阶段完成 开始替换canvas.saveState();//替换//加载文本canvas.beginText();//设置文本为中文、和字体大小canvas.setFontAndSize(bf, 8);//单位//设置坐标canvas.setTextMatrix(246.366f-2,224.543f+4);//设置文本canvas.showText("单位");//结束加载文本canvas.endText();return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} finally {if (stamper != null)stamper.close();if (pdfReader != null)pdfReader.close();}return false;}
/*
* 查找关键词坐标*/public List<TextLineMode> renderText(PdfReader pdfReader, final List<String> keywords) {final List<TextLineMode> list = new ArrayList<TextLineMode>();try {PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);int pageNum = pdfReader.getNumberOfPages();for (int i = 1; i <= pageNum; i++) {final int curPage = i;pdfReaderContentParser.processContent(curPage, new RenderListener() {@Overridepublic void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText();if (text != null) {for (int j = 0; j < keywords.size(); j++) {String keyword = keywords.get(j);if (text.contains(keyword)) {com.itextpdf.awt.geom.Rectangle2D.Float bound = textRenderInfo.getBaseline().getBoundingRectange();TextLineMode lineMode = new TextLineMode();lineMode.setHeight(bound.height == 0 ? TextLineMode.defaultHeight : bound.height);lineMode.setWidth(bound.width);lineMode.setX(bound.x);lineMode.setY(bound.y - TextLineMode.fixHeight);lineMode.setCurPage(curPage);list.add(lineMode);}}}}@Overridepublic void renderImage(ImageRenderInfo arg0) {}@Overridepublic void endTextBlock() {}@Overridepublic void beginTextBlock() {}});}} catch (IOException e) {e.printStackTrace();}return list;}public static void main(String[] args) throws Exception {List<String> keywords = new ArrayList<String>();keywords.add("09267703");//需要打码的文字new ITextPdfUtil().manipulatePdf("G:\\idea\\正常.pdf","G:\\idea\\打码.pdf", keywords);/** 填充* 在正常.pdf 文件中找到填充的坐标 * 复制打码-发票的文件 并在相应的坐标上进行填充* */new ITextPdfUtil().manipulatePdfAdd("G:\\idea\\打码-发票.pdf","G:\\idea\\打码-发票-2.pdf");}
}

使用iText对pdf中查找关键字坐标进行填充相关推荐

  1. 二分法在数组内查找数c语言,C++二分法在数组中查找关键字的方法

    本文实例讲述了C++二分法在数组中查找关键字的方法.分享给大家供大家参考.具体如下: /* 此程序演示了二分法查找算法(针对按从小到大排列的数组)的实现. */ #include using name ...

  2. 超大文件中查找关键字

    一个有10亿条记录的文本文件,已按照关键字排好序存储.请设计算法,可以快速的从文件中查找指字关键字的记录. 因为已经排好序了,可以使用 二分查找方法检索. 又因为文件过于庞大,可以将文件File分成1 ...

  3. linux 日志中查找关键字

    linux 日志中查找关键字 1.查看日志前 n行: cat 文件名 | head -n 数量 demo: cat test.log | head -n 200 # 查看test.log前200行 2 ...

  4. itext替换pdf中的中文

    2019独角兽企业重金招聘Python工程师标准>>> 在网上找了一段时间,发现有两个版本的 1,使用aspose.pdf,这篇文章写得很清楚https://blog.csdn.ne ...

  5. ITEXT-定位PDF中图片的坐标与页码

    问题场景: 用itext自动生成PDF的过程中,想要在PDF中的某一页加入水印,这个水印图片的页码不固定,所以不能直接用'sealStamperUnder = stamp.getUnderConten ...

  6. c++ 在multimap中查找关键字的程序举例

    在文件example.cc中有如下关于m1的定义: //文件example.cc #include <string> #include <iostream> #include ...

  7. grep检索关键字的命令_文件中查找关键字“ ”命令 grep

    sudo grep -irn 'COMPILE'  .  //  "." 当前目录下 关键字为'COMPILE' sudo grep -i 'COMPILE'    ltls.c ...

  8. 平衡二叉树中查找关键字结点

    二叉排序树的定义: (1)若它的左子树不为空,则左子树所有结点均小于它的根结点的值: (2)若它的右子树不为空,则右子树所有结点均大于它的根结点的值: (3)它的左右子树都是二叉排序树. 平衡二叉树本 ...

  9. itext导出pdf中新加一页空白页面(itext 遇到的问题持续更新)

    itext开发遇到的问题(持续更新) 中文无法显示 在你的pom.xml 导入,一般来说就可以解决 <dependency><groupId>com.itextpdf</ ...

  10. c语言编程顺序查找法,建立顺序表,实现顺序表的遍历,在顺序表中查找关键字为e的元素(c语言编写)...

    满意答案 qqea12345 推荐于 2017.11.24 采纳率:45%    等级:7 已帮助:1062人 楼主我大二 也刚上数据结构耶 这是我上实验课的时候用链表写的 还没交老师看  功能还差一 ...

最新文章

  1. linnux 流量控制模块tc_可编程控制器PLC基本工作原理(第一颗)
  2. OSI七层模型具体解释
  3. 信道检测手机软件 ios_【手机软件】云听:稀有神器,移动音频的国家队,某拉雅资源它都有!...
  4. linux 下启动mysql
  5. 容器编排技术 -- Kubernetes kubectl rollout history 命令详解
  6. 网上流行的经典马屁回帖
  7. CPU acceleration status:HAXM must be updated(version 1.1.16.0.1)
  8. 【githubshare】一款开源的卡通头像生成器,可自定义发型、眼镜、肤色、衣着、嘴型等属性
  9. 散落在香山的红绳情结
  10. iOS-设置导航栏颜色(iOS8+)
  11. win7与internet时间同步出错_电脑时间同步出错,教您电脑时间同步出错怎么办
  12. Java 学习笔记:第十一章 多线程技术
  13. 英文电子专业词汇(新手必备)
  14. Latex 插入的图片紧跟当前文字
  15. 如何在 JavaScript 中使用对象解构
  16. 记录——python与华为云对象存储服务OBS
  17. 鸢尾花决策树分类及可视化
  18. JavaScript实现抽奖(jQuery)
  19. “人不知而不愠”-当别人不理解我们时,怎样保持好心情?
  20. 黑马程序员Bootstrap P192-199

热门文章

  1. 微信小程序(1)--注册及下载IDE
  2. 定积分求导例题_定积分典型例题
  3. 计算机专业sci二区论文难吗,二区SCI论文要求比国内核心高吗
  4. 2022华为杯研赛E题草原放牧策略研究代码+思路
  5. 单片机大型试验——“老鼠穿墙吃蛋糕”小游戏
  6. C++移动语义及拷贝优化
  7. 国开电大0-3岁婴幼儿的保育与教育形考任务
  8. python执行js之pyexecjs
  9. csSEnet注意力网络
  10. 【学习备忘录】ele项目的环境配置