Pdf定位关键词坐标

之前就做过关键词获取坐标的demo,但是有时候会发现有些关键字,文档上面明明存在的,但是通过demo中的代码来获取,
就是获取不大,后面查资料,发现大家都有这个情况,后面在一篇博客中看到个比较好的解决方案,因为
itext 5.x 获取文本的代码textRenderInfo.getText();这个只能获取到单个字符的坐标,比如,甲方,如果你去匹配
这个关键词,是能定位到坐标的,但是如果你同时去获取甲方这个关键词就会获取不到,后面在这个博客上面看到既然
能获取到单个字,于是我有了下面这个思路:

1. 获取pdf每一页的所有字符,并放到集合中,放入格式为,x(左下角x坐标): y:(左下角y坐标) pageNo:(合同页数) key(关键字): index(在当前集合中的索引)

2. 然后将要定位的关键字分割为单个字符的数组,通过第一个字符去获取所有字符集合中,符合key=第一个字符的集合元素,并将其放到一个
新的数组中。

3. 然后去遍历第二步得到的集合,然后编辑,再判断需要匹配的第二个字符,如果当前元素的下一个元素的key值不等于我们要匹配的
第二个字符,直接跳过,如果相等,则进行第三个字符匹配,如果都相等则,我们就找到了其中符合的元素,然后再放到一个新的集合当中,
这个集合中的元素就是我们要定位的关键字的坐标的首字符的左下角坐标。

 //用来获取pdf中每一页的字符List<List<WordVO>> allWordsList = Collections.synchronizedList(new ArrayList());//获取符合关键字的结果List<KeyVO> keyVOS = new ArrayList<>();PdfReader pdfReader = new PdfReader(path);PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);//将字符串分割为单个字符数组String [] keys = key.trim().split("");for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {//获取每一页的字符集CustomerRenderListener customerRenderListener = new CustomerRenderListener(i);pdfReaderContentParser.processContent(i,customerRenderListener);//每一页的字符以及字符坐标List<WordVO> wordVOS = customerRenderListener.getWordVOS();allWordsList.add(wordVOS);}List<WordVO> filterList = new ArrayList<>();//筛选出每页符合当前关键词首个字符的元素for (int i = 0; i < allWordsList.size(); i++) {filterList.addAll(allWordsList.get(i).stream().filter(word -> word.getWord().equals(keys[0])).collect(Collectors.toList()));}for (WordVO wordVO : filterList) {for (int i = 1; i< keys.length; i++) {List<WordVO> pageWordVO =  allWordsList.get(wordVO.getPageNo()-1);//如果第二个字符不是我们想要的 直接跳过if (!keys[i].equals(pageWordVO.get(wordVO.getIndex()+i).getWord())) {break;}//表示最后一个字符都符合了,表示已经符合我我们给出的关键字标准if (i == keys.length -1) {//打印出第一个字符System.out.println(wordVO);//打印出剩余字符for (int j = 1; j < keys.length; j++) {System.out.println(pageWordVO.get(wordVO.getIndex()+j));}KeyVO keyVO = new KeyVO();keyVO.setPageNo(wordVO.getPageNo());keyVO.setX(wordVO.getX());keyVO.setY(wordVO.getY());keyVOS.add(keyVO);}}}//filterList.forEach(wordVO -> System.out.println(wordVO));return keyVOS;

2020-06-02 修改

我将该代码接入到自己项目中的时候,发现有些pdf还是读不到关键字,后面我将每页读到的字符打印到控制台,发现textRenderInfo.getText();
读到的是多个字符,如果是多个字符我们将字符去掉空格,然后分割成单个字符,添加到集合中,所以就对代码进行了一定的改造。改造如下:

 /*** 获取符合关键字首字符的坐标* @param key* @param path* @return* @throws IOException*/public static List<KeyVO> getWordPort(String key, String path) throws IOException {//用来获取pdf中每一页的字符List<List<WordVO>> allWordsList = Collections.synchronizedList(new ArrayList());PdfReader pdfReader = new PdfReader(path);PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {//获取每一页的字符集CustomerRenderListener customerRenderListener = new CustomerRenderListener(i);pdfReaderContentParser.processContent(i,customerRenderListener);//每一页的字符以及字符坐标List<WordVO> wordVOS = customerRenderListener.getWordVOS();allWordsList.add(wordVOS);}//把所有空格都去掉再分割成字符去匹配List<KeyVO> keyVOS = getPort(key.replaceAll("\\s*", "").split(""),allWordsList);return keyVOS;}/*** @param keys* @param allWordsList* @return*/private static List getPort(String [] keys,List<List<WordVO>> allWordsList) {List<WordVO> filterList = new ArrayList<>();//筛选出每页符合当前关键词首个字符的元素//筛选出每页符合当前关键词首个字符的元素for (int i = 0; i < allWordsList.size(); i++) {//这里直接匹配出文档中所有等于字符首字母的元素filterList.addAll(allWordsList.get(i).stream().filter(word -> word.getWord().equals(keys[0])).collect(Collectors.toList()));}//获取符合关键字的结果List<KeyVO> keyVOS = new ArrayList<>();for (WordVO wordVO : filterList) {//如果关键字长度只有1,表示未分割就去匹配,如果匹配到了直接返回结果就行if  (keys.length == 1) {KeyVO keyVO = new KeyVO();keyVO.setPageNo(wordVO.getPageNo());keyVO.setX(wordVO.getX());keyVO.setY(wordVO.getY());keyVOS.add(keyVO);System.out.println(wordVO);} else {for (int i = 1; i < keys.length; i++) {List<WordVO> pageWordVO =  allWordsList.get(wordVO.getPageNo()-1);//如果第二个字符不是我们想要的 直接跳过if (!keys[i].equals(pageWordVO.get(wordVO.getIndex()+i).getWord())) {break;}//表示最后一个字符都符合了,表示已经符合我我们给出的关键字标准if (i == keys.length -1) {//打印出第一个字符System.out.println(wordVO);//打印出剩余字符for (int j = 1; j < keys.length; j++) {System.out.println(pageWordVO.get(wordVO.getIndex()+j));}KeyVO keyVO = new KeyVO();keyVO.setPageNo(wordVO.getPageNo());keyVO.setX(wordVO.getX());keyVO.setY(wordVO.getY());keyVOS.add(keyVO);}}}}return keyVOS;}

注意

虽然说对代码进行了一些改造,肯定有些时候还是会获取不到关键字的,不过这种几率不会很大,如果有好的方法可以指出来,一起
改造改造。

源码地址:https://github.com/niezhiliang/pdf-keyword-port

参考博客:https://blog.csdn.net/guo123k/article/details/76417702

Pdf文件定位关键词坐标相关推荐

  1. java itextpdf签章 根据关键字定位在pdf文件中的坐标

    最近接到个需求,根据所传关键字,定位关键字所在pdf文件中的坐标,然后盖章,其中所传参数还有关键字所在页数,和获取第几次出现的关键字,会传多个印章和关键字,每个印章对应一个关键字.自己先写了个简单de ...

  2. 教程!pdf编辑器中文版如何在PDF文件查找关键词

    想要打开PDF文件查找关键词,就需要使用专业的PDF文件编辑器进行查找,在这里推荐大家使用迅捷PDF编辑器.这款软件具备完整的PDF文件编辑功能,因此利用这款软件可以对PDF文件进行任意编辑操作,其中 ...

  3. 在pdf文件中找关键字的坐标

    1.功能描述: 此功能主要功能就是在pdf文件中读取信息后查找指定页面的指定关键信息,获得相应的坐标. 首先要 itextpdf.jar, itext.jar包 //获取pdf的页数 PdfReade ...

  4. php对pdf关键字定位,如何在PDF文件中快速查找关键字

    有时候我们在阅读和编辑PDF文章时需要对PDF文件里的重要关键词进行查找,但如果PDF文章内容过长,怎么才能快速查找出想要查找的关键字? 想要在PDF文件中快速查找出关键字,那么利用迅捷PDF编辑器进 ...

  5. 如何获取PDF文件中对应内容的坐标及范围?

    如何获取PDF文件中对应内容的坐标及范围? 介绍 安装地址 使用方式 打开软件 开启坐标显示 坐标显示单位切换 开启网格辅助线 测量工具使用 介绍 这款来至Adobe公司旗下的PDF阅读器: 它免费提 ...

  6. c#实现从SharePoint下载PDF文件并根据列表文字坐标盖章、上传文件到文档库

    需要装的包:FreeSpire.PDF.Microsoft.SharePointOnline.CSOM.Microsoft.SharePoint.Client.AlibabaCloud.SDK.Dys ...

  7. 如何将CSDN文档输出PDF文件?

    简 介: 根据生成文档的需要,在CSDN上寻找一些介绍将MARKDOWN文档生成PDF博文.根据他们介绍的方法,测试打印的效果.特别是对于CSDN新增加的一些显示元素的清理,可以生成更加干净完整的PD ...

  8. pdf文件内容查看器 -- 采用wpf开发

    前言 pdf是一种应用非常广的版式文档格式,已成为事实上的国际标准.关于pdf格式的文章汗牛充栋,本文也是关于pdf格式的文章,但是本文不是纸上谈兵:本人这几周一直研究pdf格式内容,不但对pfd格式 ...

  9. Python自动化办公【PDF文件自动化】

    PDF 文件可以分为可编辑型PDF 文件与扫描型PDF 文件,内容可以复制,是可编辑型PDF文件,反之则是扫描型PDF 文件.简单理解扫描型PDF文件是由一张张图像构建而成. 读取PDF文件内容 1. ...

最新文章

  1. 播放此电影需要以下插件,但尚未安装: MPEG-4 AAC decoder
  2. JGG | 这么漂亮的Venn网络竟然可以一步在线绘制?
  3. 医院管理系统的新机遇
  4. 行为模式之Command模式
  5. POJ 1386 欧拉路的判定
  6. Oracle调用webservice说明
  7. 如何知道react对象的值_基于react怎么获取兄弟元素的对象或它的值?
  8. 危!我用python克隆了女朋友的声音!
  9. Thymeleaf select 使用 和多select 级联选择
  10. findViewById报空指针异常
  11. 任务37:生成 JWT Token
  12. python语言的语法_Python语言学习系列------基础语法(一)
  13. PySide2 QCheckBox控件应用
  14. 深入理解计算机系统bomb实验
  15. SVG黑科技微信排版『层层左右交错滑开』模板代码
  16. elementui实现上传视频功能+预览
  17. 火焰特性识别的Matlab实现方法
  18. 迪桑特宣布彭于晏成为品牌代言人
  19. 使用ContentResolver操作手机系统联系人
  20. python云图制作壮观天体照_Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图...

热门文章

  1. vue中实现定时器功能
  2. 学习Java必知的超详细基础|【大学生博客大赛】
  3. orangepi-lite2 在mac上烧录系统到tf卡
  4. Android常用数据存储之SharedPreferences存储和读取用法分享
  5. 班章管家分享存款定存1年和定存3年有什么区别?预期收益距离很大
  6. 如何将mp4视频转换成m4r音频
  7. 2022年软件行业就业分析及如何准备面试应聘
  8. 同步机无传感滑膜观测器模型加代码 仿真模型+代码(基于28035),典型的smo+pll方案
  9. 《四世同堂》杂感---老舍、著、文学出版社
  10. 单片机c语言按键调整时钟,51单片机C语言可调时钟.doc