此方法只适合通过关键字位置,在pdf上添加字符
直接上代码,代码比较长,大部分自己的理解都在代码注释中了
在main方法中测试该方法,还需要引用的jar包有itextpdf-5.5.10.jar、itext-asian-5.2.0.jar
注意:两jar包之间有版本对应,否则会出现报错,该报错主要针对设置中文字体的方法
java itext 报错 com.itextpdf.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H'

参考博客:https://www.cnblogs.com/lvlv/p/5896528.html

import com.itextpdf.text.Chunk;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.ColumnText;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;/*** @Desc* @Author madengling* @Time 2021/5/11 15:18*/
public class UpdatePdf {public static void main(String[] args) {File file = new File("G://files//cs//111.pdf");//模拟文件位置if(file!=null && file.exists()){FileInputStream is = null;try {//本地根据文件路径获取文件流is = new FileInputStream(file);long length = file.length();byte[] fileBytes = new byte[(int)length];is.read(fileBytes);//进行pdf文件修改File file1 = pdfFzSqsj(fileBytes);if(file1!=null && file1.exists()){System.out.println("修改pdf完成!");}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {if(is!=null){try {is.close();} catch (IOException e) {e.printStackTrace();}}}}}/*** 根据pdf的固定关键字,查找进行pdf相关位置增加文字* @param tpeHtcxyw 文件流* @return 修改后的文件*/private static File pdfFzSqsj(byte[] tpeHtcxyw) {PdfStamper stamper = null;try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");//获取要写入的申请时间String sj  =sdf.format(new Date());PdfReader reader = new PdfReader(tpeHtcxyw);//创建文件路径String filePath = "G://files/cs/";System.out.println("filePath="+filePath);File directory = new File(filePath);//如果pdf保存路径不存在,则创建路径if (!directory.exists()) {directory.mkdirs();}String filename = UUID.randomUUID()+"_after.pdf";//修改后文件String filename1 = UUID.randomUUID()+"_before.pdf";//修改前文件 再输出一遍,校验自己在修改之前拿到正确的文件流System.out.println("file:"+filePath+filename);File file = new File(filePath+filename);File file1 = new File(filePath+filename1);//将写入临时文件FileOutputStream  foss = new FileOutputStream (file1);foss.write(tpeHtcxyw);foss.close();//设置字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);Font font = new Font(baseFont);stamper = new PdfStamper(reader, new FileOutputStream(file));//对于已经固话的pdf回填申请时间for (int i = 1; i <= reader.getNumberOfPages(); i++) {PdfContentByte over = stamper.getOverContent(i);ColumnText columnText = new ColumnText(over);if(i==1){String str = "申请日期:";//根据关键字获取关键字位置float[] po =  Html2Pdf.getGzzzb(str,tpeHtcxyw);if(po[0]==1.00f){// 方法setSimpleColumn(float llx, float lly, float urx, float ury)// llx 和 urx  最小的值决定离左边的距离. lly 和 ury 最大的值决定离下边的距离columnText.setSimpleColumn( po[1]+46f,  po[2]-9f, 500, 0);//将时间文本创建成对象Paragraph elements = new Paragraph(0, new Chunk(new Chunk(sj)));// 设置字体,如果不设置添加的中文将无法显示elements.setFont(font);columnText.addElement(elements);columnText.go();}}}return file;} catch (Exception e) {e.printStackTrace();return null;} finally {if(stamper!=null){try {stamper.close();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}}
}

Html2Pdf

import com.itextpdf.awt.geom.Rectangle2D;
import com.itextpdf.text.pdf.PdfReader;
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 Html2Pdf {/*** 定位pdf文件中关键字坐标* @param signKey 关键字* @param pdf 文件流* @return 坐标位置*/public static float[] getGzzzb(String signKey, byte[] pdf){PdfReader reader=null;final float[] po = new float[3];try{reader = new PdfReader(pdf);int pageNum = reader.getNumberOfPages();final String signKeyWord = signKey;for(int page=1; page <= pageNum; page++){PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(reader);pdfReaderContentParser.processContent(page, new RenderListener() {StringBuilder sb = new StringBuilder("");int maxLength = signKeyWord.length();@Overridepublic void renderText(TextRenderInfo textRenderInfo) {// 只适用 单字块文档 以及 关键字整个为一个块的情况// 设置 关键字文本为单独的块,不然会错位boolean isKeywordChunk = textRenderInfo.getText().length() == maxLength;if (isKeywordChunk) {// 文档按照 块 读取sb.delete(0, sb.length());sb.append(textRenderInfo.getText());} else {// 有些文档 单字一个块的情况// 拼接字符串sb.append(textRenderInfo.getText());// 去除首部字符串,使长度等于关键字长度if (sb.length() > maxLength) {sb.delete(0, sb.length() - maxLength);}}// 判断是否匹配上if (signKeyWord.equals(sb.toString())) {// 计算中心点坐标Rectangle2D.Float baseFloat = textRenderInfo.getBaseline().getBoundingRectange();Rectangle2D.Float ascentFloat = textRenderInfo.getAscentLine().getBoundingRectange();float centreX;float centreY;if (isKeywordChunk) {centreX = baseFloat.x + 5*ascentFloat.width / 6;centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6);} else {centreX = baseFloat.x + ascentFloat.width - (5*maxLength * ascentFloat.width / 6);centreY = baseFloat.y + (5*(ascentFloat.y - baseFloat.y) / 6);}po[0]=1.00f;po[1]=centreX+3;po[2]=centreY;// 匹配完后 清除sb.delete(0, sb.length());}}@Overridepublic void renderImage(ImageRenderInfo arg0) {}@Overridepublic void endTextBlock() {}@Overridepublic void beginTextBlock() {}});}if(po[0]==1.00f){return po;}}catch(Exception e){e.printStackTrace();}finally {if(reader!=null){reader.close();}}return null;}}

结果图:
111.pdf是原始文件,其余两文件在方法执行后生成,before文件内容与111.pdf一致

我的原始pdf中含有关键字申请时间,修改前后文件内容如下:

通过关键字修改pdf相关推荐

  1. 如何编辑PDF文件,怎么修改PDF中的文字

    相信大家都使用过PDF文件,那么有没有编辑过PDF文件呢,PDF文件的编辑是需要借助PDF编辑器的,PDF文件中的文字要怎么修改呢,Word文档的文字就直接编辑,而PDF文件并非这样,想知道怎么编辑吗 ...

  2. 如何修改pdf文件的背景色

    PDF文件在生活中很常见,我们电子书就是PDF格式的,在阅读电子书的时候,如果你不喜欢它的背景色,想修改它的背景色,我们改怎么做! 小编知道一个在线修改PDF文件的网址,这里分享给大家PDF背景颜色h ...

  3. 怎么修改_PDF怎么修改文字?其实修改PDF内容很简单

    PDF文件是工作和生活中经常会使用的一种,这类文件的优点是兼容性较好,即使在多种设备上打开阅读也不容易变成乱码文件:但同时这也是它的缺点就是不易编辑修改内容了,如果修改pdf文件中的内容,我们是可以借 ...

  4. 苹果手机怎么编辑word文档_原创首发:编辑和修改PDF文档,将PDF转换为WORD技巧...

    在之前的文章中介绍了如何将图片合成为PDF文档,今天将为大家介绍下如何编辑和修改PDF文档,以及将PDF转换为WORD的技巧. 使用到工具Adobe Acrobat 编辑和修改PDF 文档 方法1.使 ...

  5. PDF 补丁丁 (修改PDF书签;拆分、合并、制作PDF;提取图片) 0.3.0.8 正式版

    PDF 补丁丁 0.3.0.8 正式版 新版本已经发布,请到博客首页下载. 软件简介 PDF补丁丁是一个用于修改PDF文件信息的工具.它具有以下功能: ■ 修改文档(带"*"号部分 ...

  6. 极速pdf编辑器的水印如何去掉_如何修改PDF?有没有详细的PDF编辑器操作方法?...

    在工作中我们每天都会处理很多文件,而PDF格式因为其格式稳定也被越来越多的人接受并使用,但也正因为如此,PDF的修改相比较以前常用的Word会复杂很多.那么应该如何修改PDF呢?其实使用PDF编辑器就 ...

  7. Acrobat如何修改PDF/A模式下的PDF文档

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 1. PDF/A介 ...

  8. 如何修改PDF内容,PDF怎么旋转页面

    在编辑PDF文件的时候总会遇到各种各样的问题,编辑PDF文件是需要用到PDF编辑器的,在使用PDF编辑器修改文件的时候,文件中的页面不是正常显示的,该如何将页面进行旋转呢,不会的话,就一起看看下面的文 ...

  9. 如何修改PDF并调整页面尺寸大小

    虽然现在PDF电子文档的使用已经比较普遍了,但是修改PDF应该用什么样的工具,怎样才能编辑PDF,如何调整PDF的页面尺寸等等依然还很多人不清楚,下面我们详细来说一说. 对于PDF文档的修改工具,与常 ...

  10. 教你如何编辑修改PDF文件内容

    PDF这种便携式的文档,因其独有的特性在现在的办公中应用越来越广,虽然这种文档经常遇见但是还有很多人对PDF内容的修改不是很清楚,下面就讲下怎么编辑修改pdf的文字. ​ 查看PDF文件通过阅读器就可 ...

最新文章

  1. TVM,Relay,Pass
  2. ADC的有效位数、信噪比、总谐波失真的参数计算
  3. Linux Rootkit 系列二:基于修改 sys_call_table 的系统调用挂钩
  4. java 访问access数据库_使用JAVA访问ACCESS数据库的方法
  5. poj3186 Treats for the Cows(区间)
  6. 成功通航:用宜搭提升数字化管理效能,确保每次飞行任务安全执行
  7. GraphQL —— 接口类型
  8. 计算机专业课如何阅卷,全国计算机等级考试评卷老师是如何阅卷的?
  9. 安卓移动办公软件_小企业使用的移动办公软件
  10. gps校正 android,通过GPS时间同步Android设备?
  11. java mongodb avg_Java-mongodb-AggregationOutput(分组、统计)
  12. 51单片机 独立按键k1控制数码管移位 k2控制数值加
  13. Linux新手入门之基础命令操作
  14. 银河麒麟加完全自主的龙芯指令集,组合渡劫能否成功
  15. 七夕h5开发就找TOM小游戏
  16. 005_HTML制作炫酷登录界面(CSS精灵图、背景图片局部显示)
  17. 【mysql】mysql数据备份与恢复
  18. 泌尿系统CT成像-常识
  19. java license机制dll_LicenseJava.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  20. 单选框,下拉框,复选框 的回显

热门文章

  1. 微信小程序(1)--注册及下载IDE
  2. 【Love2d从青铜到王者】第十六篇:Love2d之动画(Animation)
  3. Python + Opencv 实现遥感影像tif格式转jpg
  4. 蒙特卡罗方法C语言求定积分,蒙特卡罗方法计算定积分
  5. 工商银行二维码业务开发
  6. 百度竞价推广之关键词的选择策略
  7. 审稿较快的2区计算机sci期刊,哪些SCI期刊的审稿速度快
  8. gnu coreutils4.5.1 hostid.c源码解读
  9. css背景随机,CSS如何随机定义网页中的背景颜色
  10. Android shape属性大全