使用itextpdf达到在PDF指定位置进行批注的效果

之前有遇到一个需求,这PDF的指定位置上添加一个文字或者图片(思路一致),当时在网上找了一波,总结一下。

  1. 在PDF指定位置添加文字有两种情况,一是已知指定位置的坐标(可在前台使用PDF.js计算得多,本文暂时不多介绍),二是使用工具类在PDF上查找关键字来得知坐标,本次使用的itextpdf工具类能够达到这一效果。
  2. 第一步就不用多说了,先通过pom文件引入jar包
<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>
  1. 通过关键字查看,关键字的坐标
 /*** filepath:文件路径加文件名* KEY_WORD:关键字 要求:(报表中关键字不能加粗,宋体,字号9)*/private static int i = 1;static List arrays = new ArrayList();static String sb ;public static List getKeyWords(String filePath,final String KEY_WORD) {arrays.clear();sb="";try {PdfReader pdfReader = null;pdfReader = new PdfReader(filePath);//获取PDF的页数int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);for (i = 1; i <= pageNum; i++) {pdfReaderContentParser.processContent(i, new RenderListener() {@Overridepublic void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText(); // 整页内容if (null != text && text.contains(KEY_WORD)) {Rectangle2D.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();sb = boundingRectange.x+"--"+boundingRectange.y+"---";float[] resu = new float[3];resu[0] = boundingRectange.x;resu[1] = boundingRectange.y;resu[2] = i;arrays.add(resu);}}@Overridepublic void renderImage(ImageRenderInfo arg0) {// TODO Auto-generated method stub}@Overridepublic void endTextBlock() {// TODO Auto-generated method stub}@Overridepublic void beginTextBlock() {// TODO Auto-generated method stub}});}pdfReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return arrays;}

返回数组里的xy即关键字的左上角坐标(坐标原点为左上角)


4.批注,通过坐标等进行批注

/*** 往PDF上指定坐标添加文字内容* @param inPath 输入地址* @param filename 文件名* @param outPath 输出地址* @param fontsize 字体大小* @param x 目标离左边距离* @param y 目标离下边距离* @param pageNum 目标页码* @param content 目标内容*/public static Integer addContent2Pdf(java.lang.String inPath, String filename, String outPath, Integer[] fontsize, Float[] x, Float[] y, Integer[] pageNum, String[] content,Float[] leading,Float[] width) {BaseFont baseFont = null;Integer rownum=0;Float fontheight;//字体高度Float poxy;try {PdfReader reader = new PdfReader(new FileInputStream(inPath+filename));//设置输入文件以及输出文件地址PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outPath+filename));//设置字体baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);for(int i=0;i<fontsize.length;i++){//循环批注Font font = new Font(baseFont,fontsize[i]);//设置批注的页码PdfContentByte over = stamper.getOverContent(pageNum[i]);ColumnText columnText = new ColumnText(over);// llx 和 urx  最小的值决定离左边的距离. lly 和 ury 最大的值决定离下边的距离
//                columnText.setSimpleColumn(x[i], y[i], x[i]+1000, y[i]-y[i]);
//                fontheight=fontsize[i]*1.2f;fontheight=leading[i];poxy=y[i]-fontheight*rownum;columnText.setSimpleColumn(x[i],poxy, x[i]+width[i], 0);//leading段落长度,可用于换行等Paragraph elements = new Paragraph(leading[i], new Chunk(content[i]));// 设置字体,如果不设置添加的中文将无法显示elements.setFont(font);columnText.addElement(elements);columnText.go();rownum+=columnText.getLinesWritten();}stamper.close();} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}//批注了几行return rownum;}

大概逻辑这就样,因为时间太久远了,也忘记是参考自哪位老哥了

itextpdf查找关键字坐标,以及在特定位置添加文字相关推荐

  1. mysql 指定位置添加列,如何在MySQL现有表中的特定位置添加列?

    要在现有表中的特定位置添加列,请使用after命令.语法如下-ALTER TABLE yourTableName ADD COLUMN yourColumnName data type AFTER y ...

  2. java根据坐标在PDF指定位置添加文本

    目录 一.使用Aspose 1.前言: 2.创建一个模型 3.demo测试 二.使用Itext 1.前言 2.创建模型 3.测试demo 1)测试方法 2)实现代码 三.效果展示 一.使用Aspose ...

  3. HiveSql一天一个小技巧:如何在表的特定位置添加字段

    hive表在某个特定的位置添加一个字段,在操作上是先在表的最后添加一个字段然后再将该字段移动到那个特定的位置 第一步:先在最后一个位置增加字段 alter table table_name add c ...

  4. dom4j在特定位置添加节点

    //在第一个p1下面的age标签之前添加<school>ecit</schlool> public static void addAgeBefore() throws Exce ...

  5. C#实现在现有图片的指定位置添加文字

    添加引用: using System.Drawing; using System.Drawing.Imaging; public Bitmap CreateBMP(Image image){//声明位 ...

  6. ffmpeg指定位置添加文字图片水印

    FFmpeg命令详解_Android&Java&C-CSDN博客 ​​​​​​利用ffmpeg实现添加图片水印和文字水印,添加多个水印.代码和命令实现及中文水印乱码_浪漫老狼的博客-C ...

  7. android分辨率 x y,Android - 确定不同分辨率的位图上的特定位置(X,Y坐标)?

    我正在尝试创建的应用程序是棋盘游戏.它将有一个位图作为棋盘和棋子,移动到棋盘上的不同位置.该板的一般设计是方形的,具有一定数量的行和列,并具有用于外观的边框.想象一下国际象棋棋盘或拼字游戏板.Andr ...

  8. python查找关键字在目录的某些文件哪个位置 行数_Python目录爬虫扫描各种文件并搜索关键字...

    我正在尝试创建一个目录爬虫来搜索文件夹及其所有子文件夹中的所有文件中的特定关键字.这就是我目前所拥有的(在本例中,我要查找关键字"olofx"):import os rootDir ...

  9. pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...

    我正在从n个页面的输入pdf文件中读取特定位置,并在这些位置上列出文本. 然后,我编写一个新的pdf文档,并将列表中的这些字符串写入包含单元格的表中. 我提出了两个主要问题. 我想在表中有三列,但是如 ...

  10. C# RichTextBox 实现循环查找关键字

    实现效果如上图,点击"Search"按钮,开始从文首查找关键字"menu",并高亮,再次点击"Search"按钮,继续查找下一个.查找到文末 ...

最新文章

  1. ★ 科幻分离式手机 富士通F-04B详细图解 ★
  2. Go协程通道锁故事化理解
  3. [WinSock]封装WSAAsyncSelect!
  4. C#多线程时对同一资源加锁实现互斥访问
  5. sip协议详解_SIP协议详解-INVITE消息发送过程
  6. ❤️六W字《计算机基础知识》(四)(建议收藏)❤️
  7. 【html】【19】高级篇--大事件时间轴
  8. 2019最新python面试题详解(应届生)
  9. 二维vector容器读取txt坐标
  10. python病毒usb文件自动安装_将文件自动复制到USB上
  11. 傅盛希望定义AI时代的机器人产品,2年交出这份可落地答卷
  12. php后缀加swp,注意发现交换文件 filename.swp
  13. 博图安装msi失败_博途,V13,安装出现如此问题如何解决
  14. 升余弦滤波器与无码间串扰(一)
  15. pycharm如何下载库?
  16. 基于java的URP教务系统爬虫实现
  17. python输入数据可视化_Python数据可视化
  18. 《星际争霸》怀念星际历史上最强的队伍系列三
  19. 不错的金庸人物考考你android游戏源码
  20. 简书markdown

热门文章

  1. 免费素材库:mixkit
  2. 考研常识:考研加分和照顾政策有哪些?
  3. android 自定义空白,自定义对话框在android中顶部留有空白
  4. 北大公开课计算机,清华、北大、浙大的计算机课程资源集都在这里了
  5. 蓉叶云库——简单介绍seo技术
  6. matlab latex 表格,latex表格绘制及对齐
  7. 论文阅读——Multi-scale Domain-adversarial Multiple-instance CNN for Cancer Subtype Classification
  8. 多视点视频编码快速模式选择算法综述
  9. VC++使用管道重定向进程输入输出(附源码)
  10. linux查看hostid,lmhostid获取hostid为空问题