maven依赖

<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.12</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-pdfa</artifactId><version>5.5.12</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-xtra</artifactId><version>5.5.12</version><exclusions><exclusion><groupId>org.apache.commons</groupId><artifactId>commons-imaging</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.12</version>
</dependency>

辅助实体类

@Data
public class PdfAddContentParm {// 要添加的文字private String content;// 页码private Integer pageNum;// 关键字private String keyword;// 文本框坐标(左下角x,y,右上角x,y)private Float llx;private Float lly;private Float urx;private Float ury;public PdfAddContentParm() {}public PdfAddContentParm(String content, Integer pageNum, Float llx, Float lly, Float urx, Float ury) {this.content = content;this.pageNum = pageNum;this.llx = llx;this.lly = lly;this.urx = urx;this.ury = ury;}public PdfAddContentParm(String content,  String keyword, Float llx, Float lly, Float urx, Float ury) {this.content = content;this.keyword = keyword;this.llx = llx;this.lly = lly;this.urx = urx;this.ury = ury;}}

按坐标添加批注

public static byte[] pdfAddContent(String filePath, List<PdfAddContentParm> pdfAddContentParms) throws Exception {PdfReader pdfReader = new PdfReader(filePath);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//设置输入文件以及输出文件地址PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);//设置字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {Font font = new Font(baseFont, 10);PdfContentByte overContent = stamper.getOverContent(pdfAddContentParm.getPageNum());ColumnText columnText = new ColumnText(overContent);columnText.setSimpleColumn(pdfAddContentParm.getLlx(), pdfAddContentParm.getLly(), pdfAddContentParm.getUrx(), pdfAddContentParm.getUry());Paragraph elements = new Paragraph(pdfAddContentParm.getContent());elements.setFont(font);columnText.addElement(elements);columnText.go();}stamper.close();return byteArrayOutputStream.toByteArray();}

按关键字添加批注

思路是:定位到关键字---->获取关键字的坐标---->根据关键字的坐标偏移得到要添加批注的坐标---->按坐标添加批注

private static byte[] pdfAddContByKeyword(String filename, List<PdfAddContentParm> pdfAddContentParms) throws Exception {PdfReader pdfReader = new PdfReader(filename);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();//设置输入文件以及输出文件地址PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);// 获取PDF文件的总页数int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);for (PdfAddContentParm pdfAddContentParm : pdfAddContentParms) {StringBuilder stringBuilder = new StringBuilder("");final boolean[] hasKeyword = {false, true};String keyword = pdfAddContentParm.getKeyword();int length = keyword.length();for (int page = 1; page <= pageNum; page++) {if (hasKeyword[0]) {break;}int finalPage = page;pdfReaderContentParser.processContent(page, new RenderListener() {@Overridepublic void beginTextBlock() {}@SneakyThrows@Overridepublic void renderText(TextRenderInfo renderInfo) {// 读取PDF文件的内容String text = renderInfo.getText().trim();stringBuilder.append(text);if (stringBuilder.toString().contains(keyword)) {Rectangle2D.Float boundingRectange = renderInfo.getBaseline().getBoundingRectange();if (hasKeyword[1]) {System.out.println(boundingRectange);// 关键字的坐标double x = boundingRectange.getX();double y = boundingRectange.getY();//设置字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);Font font = new Font(baseFont, 10);PdfContentByte overContent = stamper.getOverContent(finalPage);ColumnText columnText = new ColumnText(overContent);// 根据关键字的坐标计算+偏移量得到批注字体的坐标columnText.setSimpleColumn((float) x+pdfAddContentParm.getLlx(), (float)y+pdfAddContentParm.getLly(),(float) x+100+pdfAddContentParm.getUrx(), (float) y+pdfAddContentParm.getUry());Paragraph elements = new Paragraph(pdfAddContentParm.getContent());elements.setFont(font);columnText.addElement(elements);columnText.go();hasKeyword[1] = false;}hasKeyword[0] = true;}if (stringBuilder.toString().length() > length * 3) {stringBuilder.setLength(0);}}@Overridepublic void endTextBlock() {}@Overridepublic void renderImage(ImageRenderInfo renderInfo) {}});}}stamper.close();pdfReader.close();return byteArrayOutputStream.toByteArray();
}

调用示例:

public static void main(String[] args) throws Exception {// 按坐标添加批注PdfAddContentParm name = new PdfAddContentParm("张三", 2, 280F, 36F, 475F, 78F);PdfAddContentParm no = new PdfAddContentParm("02666666666SSS", 2, 425F, 36F, 550F, 78F);List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();Collections.addAll(pdfAddContentParms, prtno, year, month, day,name,no);byte[] bytes = pdfAddContent("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);// 按关键字批注PdfAddContentParm keyword = new PdfAddContentParm("112233", "尊敬的客户", 1F, 2F, 3F, 40F);PdfAddContentParm keyword1 = new PdfAddContentParm("112233", "销售人员签名:", 1F, 2F, 3F, 40F);List<PdfAddContentParm> pdfAddContentParms = new ArrayList<>();Collections.addAll(pdfAddContentParms, keyword,keyword1);byte[] bytes = pdfAddContByKeyword("/Users/yy/Desktop/pppp.pdf", pdfAddContentParms);new FileOutputStream("/Users/yy/Desktop/pppadd.pdf").write(bytes);}

效果:

使用itext为PDF添加批注文字相关推荐

  1. java springboot使用itext 为PDF添加文字水印并铺满屏

    java springboot使用itextpdf 为PDF添加文字水印并铺满屏 代码如下 如果对你有帮助希望你能点个赞 结尾 这是我第一次发博客,也是第一次使用itext添加水印.遇到一些大大小小的 ...

  2. vue 前端实现对pdf添加批注

    1.选择pdf-lib插件对pdf进行修改,安装npm install --save pdf-lib 选择quill插件作为添加批注时的富文本编辑框,安装npm install --quill 2.实 ...

  3. IText导出PDF添加图片,解决中文问题

    利用IText导出PDF: 使用.ftl模板引入图片不显示,不报错,但是它找不到图片, .separator {margin: 15px;height: 16px;text-align: center ...

  4. java 通过 itext生成pdf添加,插入文字,图片

    准备工作 引用pom <!--生成pdf--><dependency><groupId>com.itextpdf</groupId><artifa ...

  5. R pdf大小_怎样给PDF添加批注并同步到手机里?

    一般在查看电子版的PDF资料时需要实时添加一些笔记,这种笔记一般称为批注或注释?手机一般很少有软件能直接操作,我们可以通过电脑版添加后再同步到手机,下面看一下具体操作方法. 首先用极速PDF阅读器打开 ...

  6. java 通过itext 创建pdf 添加,插入 表格,html格式

    准备工作 引用pom <!--生成pdf--> <dependency> <groupId>com.itextpdf</groupId> <art ...

  7. java使用iText导出pdf添加页眉,并设置图片

    PdfWriter pdfWriter;Document document; public ExportPDF(File file) {document = new Document();// 建立一 ...

  8. java实现word和pdf添加文字水印

    相关jar包 链接:https://pan.baidu.com/s/1VkcCsKIqSHlg5vwIOHoHeg 提取码:ju96 实现代码 import com.itextpdf.text.Bas ...

  9. itext给已有pdf添加页眉页脚

    网上百度到的基本都是生成pdf的时候,添加页眉页脚,但是假如对已有的pdf添加页眉页脚就比较麻烦,突然想到了可以曲线救国,用itext进行复制pdf的时候,在添加页眉页脚,最后可以成功的. 生成pdf ...

最新文章

  1. 58同城 Elasticsearch 应用及平台建设实践
  2. Oracle的sql 函数
  3. 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )
  4. 用HttpURLConnection发送http请求
  5. 【离散数学】极小全功能集
  6. 疑似禁令影响开始显现:华为Mate 40量产或被迫推迟
  7. 思科钱伯斯:云安全是根本
  8. mysql regexp边界_MySQL中REGEXP正则表达式使用大全
  9. java 字符流异常处理_IO字符流9jdk7和jdk9中流的异常的处理
  10. QQ上最牛的离线留言消息
  11. window.print设置目标打印机_愿得一人心,白首不相离, 极印手机照片打印机入手体验...
  12. 微信小程序实现带参数的分享功能
  13. 推荐书籍:网络流量整形与带宽控制技术
  14. 诸子百家的十二家学派
  15. 自适应蝴蝶算法附matlab代码IBOA
  16. Linux下Socket编程之TCP原理
  17. 计算机找不到 bitlocker,win10中找不到bitlocker驱动器的解决方法介绍
  18. matlab求函数在x0的值,MATLAB和C++数据交类实例---求任意函数y=f(x)的n阶导数,并计算在x=x0处的值...
  19. python莱布尼茨公式求π
  20. Web安全信息收集之CMS指纹识别

热门文章

  1. 好用的图片转换器:SizeMyPics for Mac
  2. Day26.爬虫案例一:拍拍网
  3. MyBatisPlus分页插件返回结果records为空
  4. 计算机毕业设计(附源码)python疫苗注射动态数据可视化系统
  5. 猴子选大王C/C++(两种方法)
  6. 基于Vshare插件实现vue分享功能
  7. 【MC】我的世界零基础开云服务器教程
  8. stash 相关操作(Git命令之一)
  9. java 输出格式_java格式化输出方法
  10. ClickOnce管理员启动并且支持ClickOnce更新