使用itext为PDF添加批注文字
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添加批注文字相关推荐
- java springboot使用itext 为PDF添加文字水印并铺满屏
java springboot使用itextpdf 为PDF添加文字水印并铺满屏 代码如下 如果对你有帮助希望你能点个赞 结尾 这是我第一次发博客,也是第一次使用itext添加水印.遇到一些大大小小的 ...
- vue 前端实现对pdf添加批注
1.选择pdf-lib插件对pdf进行修改,安装npm install --save pdf-lib 选择quill插件作为添加批注时的富文本编辑框,安装npm install --quill 2.实 ...
- IText导出PDF添加图片,解决中文问题
利用IText导出PDF: 使用.ftl模板引入图片不显示,不报错,但是它找不到图片, .separator {margin: 15px;height: 16px;text-align: center ...
- java 通过 itext生成pdf添加,插入文字,图片
准备工作 引用pom <!--生成pdf--><dependency><groupId>com.itextpdf</groupId><artifa ...
- R pdf大小_怎样给PDF添加批注并同步到手机里?
一般在查看电子版的PDF资料时需要实时添加一些笔记,这种笔记一般称为批注或注释?手机一般很少有软件能直接操作,我们可以通过电脑版添加后再同步到手机,下面看一下具体操作方法. 首先用极速PDF阅读器打开 ...
- java 通过itext 创建pdf 添加,插入 表格,html格式
准备工作 引用pom <!--生成pdf--> <dependency> <groupId>com.itextpdf</groupId> <art ...
- java使用iText导出pdf添加页眉,并设置图片
PdfWriter pdfWriter;Document document; public ExportPDF(File file) {document = new Document();// 建立一 ...
- java实现word和pdf添加文字水印
相关jar包 链接:https://pan.baidu.com/s/1VkcCsKIqSHlg5vwIOHoHeg 提取码:ju96 实现代码 import com.itextpdf.text.Bas ...
- itext给已有pdf添加页眉页脚
网上百度到的基本都是生成pdf的时候,添加页眉页脚,但是假如对已有的pdf添加页眉页脚就比较麻烦,突然想到了可以曲线救国,用itext进行复制pdf的时候,在添加页眉页脚,最后可以成功的. 生成pdf ...
最新文章
- 58同城 Elasticsearch 应用及平台建设实践
- Oracle的sql 函数
- 【Android 逆向】ART 脱壳 ( DexClassLoader 脱壳 | exec_utils.cc 中执行 Dex 编译为 Oat 文件的 Exec 和 ExecAndReturnC函数 )
- 用HttpURLConnection发送http请求
- 【离散数学】极小全功能集
- 疑似禁令影响开始显现:华为Mate 40量产或被迫推迟
- 思科钱伯斯:云安全是根本
- mysql regexp边界_MySQL中REGEXP正则表达式使用大全
- java 字符流异常处理_IO字符流9jdk7和jdk9中流的异常的处理
- QQ上最牛的离线留言消息
- window.print设置目标打印机_愿得一人心,白首不相离, 极印手机照片打印机入手体验...
- 微信小程序实现带参数的分享功能
- 推荐书籍:网络流量整形与带宽控制技术
- 诸子百家的十二家学派
- 自适应蝴蝶算法附matlab代码IBOA
- Linux下Socket编程之TCP原理
- 计算机找不到 bitlocker,win10中找不到bitlocker驱动器的解决方法介绍
- matlab求函数在x0的值,MATLAB和C++数据交类实例---求任意函数y=f(x)的n阶导数,并计算在x=x0处的值...
- python莱布尼茨公式求π
- Web安全信息收集之CMS指纹识别