在pdf文件中找关键字的坐标
1.功能描述;
此功能主要功能就是在pdf文件中读取信息后查找指定页面的指定关键信息,获得相应的坐标。
首先要 itextpdf.jar, itext.jar包
//获取pdf的页数
PdfReader reader= new PdfReader(generatePath);
int pagecount= reader.getNumberOfPages();
/**
在文件中寻找指定的文字内容
@param reader
@param pageNumber
@param keyword
@return
@throws Exception
*/
public static MatchItem matchPage(com.itextpdf.text.pdf.PdfReader reader,
Integer pageNumber, String keyword) throws Exception {
KeyWordPositionListener renderListener = new KeyWordPositionListener();
renderListener.setKeyword(keyword);
PdfReaderContentParser parse = new PdfReaderContentParser(reader);
Rectangle rectangle = reader.getPageSize(pageNumber);
renderListener.setPageNumber(pageNumber);
renderListener.setCurPageSize(rectangle);
parse.processContent(pageNumber, renderListener);
MatchItem matchItem = findKeywordItems(renderListener, keyword);
// 当前页找不到,到前一页查询
}
/**
找到匹配的关键词块
@param renderListener
@param keyword
@return
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static MatchItem findKeywordItems(KeyWordPositionListener renderListener,
String keyword) {
// 先判断本页中是否存在关键词
List allItems = renderListener.getAllItems();// 所有块LIST
StringBuffer sbtemp = new StringBuffer("");
for (int i = 0; i < allItems.size(); i++) {// 将一页中所有的块内容连接起来组成一个字符串。
sbtemp.append(((MatchItem) allItems.get(i)).getContent());
}
if (sbtemp.toString().lastIndexOf(keyword) == -1) {// 一页组成的字符串没有关键词,直接return
return renderListener.getMatches().get(0);
}
// 第一种情况:关键词与块内容完全匹配的项
List matches = renderListener.getMatches();
// 第二种情况:多个块内容拼成一个关键词,则一个一个来匹配,组装成一个关键词
sbtemp = new StringBuffer("");
List tempItems = new ArrayList();
for (int i = 0; i < allItems.size(); i++) {
// 1,关键词中存在某块 2,拼装的连续的块=关键词 3,避开某个块完全匹配关键词
// 关键词 中国移动 而块为 中 ,国,移动
// 关键词 中华人民 而块为中,华人民共和国 这种情况解决不了,也不允许存在
if (keyword.indexOf(((MatchItem) allItems.get(i)).getContent()) != -1
&& !keyword.equals(((MatchItem) allItems.get(i))
.getContent())) {
tempItems.add(allItems.get(i));
sbtemp.append(((MatchItem) allItems.get(i)).getContent());
if (keyword.indexOf(sbtemp.toString()) == -1) {// 如果暂存的字符串和关键词
// 不再匹配时
sbtemp = new StringBuffer(
((MatchItem) allItems.get(i)).getContent());
tempItems.clear();
tempItems.add(allItems.get(i));
}
}
// 第三种情况:关键词存在块中
for (int j = 0; j < allItems.size(); j++) {
if (((MatchItem) allItems.get(j)).getContent().indexOf(keyword) != -1
&& !keyword.equals(((MatchItem) allItems.get(j))
.getContent())) {
matches.add(allItems.get(j));
}
}
}
return (MatchItem) matches.get(0);
}
import com.itextpdf.awt.geom.Rectangle2D;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
import java.util.ArrayList;
import java.util.List;
public class KeyWordPositionListener implements RenderListener {
private List<MatchItem> matches = new ArrayList<MatchItem>();
private List<MatchItem> allItems = new ArrayList<MatchItem>();
private Rectangle curPageSize;
/**
* 匹配的关键字
*/
private String keyword;
/**
* 匹配的当前页
*/
private Integer pageNumber;
public void beginTextBlock() {
//do nothing
}
public void renderText(TextRenderInfo renderInfo) {
String content = renderInfo.getText();
content = content.replace("<", "").replace("《", "").replace("(", "").replace("(", "").replace("\"", "").replace("'", "")
.replace(">", "").replace("》", "").replace(")", "").replace(")", "").replace("、", "").replace(".", "")
.replace(":", "").replace(":", "").replace(" ", "");
Rectangle2D.Float textRectangle = renderInfo.getDescentLine().getBoundingRectange();
MatchItem item = new MatchItem();
item.setContent(content);
item.setPageNum(pageNumber);
item.setPageWidth(curPageSize.getWidth());
item.setPageHeight(curPageSize.getHeight());
item.setX((float)textRectangle.getX());
item.setY((float)textRectangle.getY());
if(content!=null && content!=""){
if(content.equalsIgnoreCase(keyword)) {
matches.add(item);
}
}else{
item.setContent("空字符串");
}
allItems.add(item);//先保存所有的项
}
public void endTextBlock() {
//do nothing
}
public void renderImage(ImageRenderInfo renderInfo) {
//do nothing
}
/**
* 设置需要匹配的当前页
* @param pageNumber
*/
public void setPageNumber(Integer pageNumber) {
this.pageNumber = pageNumber;
}
/**
* 设置需要匹配的关键字,忽略大小写
* @param keyword
*/
public void setKeyword(String keyword) {
this.keyword = keyword;
}
/**
* 返回匹配的结果列表
* @return
*/
public List<MatchItem> getMatches() {
return matches;
}
void setCurPageSize(Rectangle rect) {
this.curPageSize = rect;
}
public List<MatchItem> getAllItems() {
return allItems;
}
public void setAllItems(List<MatchItem> allItems) {
this.allItems = allItems;
}
}
public class MatchItem {
private Integer pageNum;
private Float x;
private Float y;
private Float pageWidth;
private Float pageHeight;
private String content;
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Float getX() {
return x;
}
public void setX(Float x) {
this.x = x;
}
public Float getY() {
return y;
}
public void setY(Float y) {
this.y = y;
}
public Float getPageWidth() {
return pageWidth;
}
public void setPageWidth(Float pageWidth) {
this.pageWidth = pageWidth;
}
public Float getPageHeight() {
return pageHeight;
}
public void setPageHeight(Float pageHeight) {
this.pageHeight = pageHeight;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "MatchItem [pageNum=" + pageNum + ", x=" + x + ", y=" + y
+ ", pageWidth=" + pageWidth + ", pageHeight=" + pageHeight
+ ", content=" + content + "]";
}
}
这样就可以在调用这个方法后获取matchPage改关键字的坐标了。
在pdf文件中找关键字的坐标相关推荐
- 查找多个 PDF 文件中的关键字并替换为其它文字
概要:在一个文件中查找并替换关键字的场景下,我们都知道怎么去操作,我们直接按住Ctrl+F5或者直接按软件界面上的查找按钮,并且替换就可以了.但是如果我们需要一次性的查找并替换PDF文件中的多个关键字 ...
- 如何获取PDF文件中对应内容的坐标及范围?
如何获取PDF文件中对应内容的坐标及范围? 介绍 安装地址 使用方式 打开软件 开启坐标显示 坐标显示单位切换 开启网格辅助线 测量工具使用 介绍 这款来至Adobe公司旗下的PDF阅读器: 它免费提 ...
- grep检索关键字的命令_文件中查找关键字“ ”命令 grep
sudo grep -irn 'COMPILE' . // "." 当前目录下 关键字为'COMPILE' sudo grep -i 'COMPILE' ltls.c ...
- java itextpdf签章 根据关键字定位在pdf文件中的坐标
最近接到个需求,根据所传关键字,定位关键字所在pdf文件中的坐标,然后盖章,其中所传参数还有关键字所在页数,和获取第几次出现的关键字,会传多个印章和关键字,每个印章对应一个关键字.自己先写了个简单de ...
- php对pdf关键字定位,如何在PDF文件中快速查找关键字
有时候我们在阅读和编辑PDF文章时需要对PDF文件里的重要关键词进行查找,但如果PDF文章内容过长,怎么才能快速查找出想要查找的关键字? 想要在PDF文件中快速查找出关键字,那么利用迅捷PDF编辑器进 ...
- 使用itext7在PDF文件中的指定文字位置添加电子签名图片技术记录
使用itext7在PDF文件中的指定文字位置添加电子签名图片 文章目录 使用itext7在PDF文件中的指定文字位置添加电子签名图片 一.技术使用背景 二.使用步骤 1.引入依赖 2.具体代码 2.控 ...
- 用友t3服务器文件丢失,用友T3软件在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决?-用友T3...
文章摘要:用友T3软件在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决?在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决? 问题模块: 系统管理关键字:备份 ...
- 手把手教你如何用Python从PDF文件中导出数据(附链接)
作者:Mike Driscoll :翻译:季洋:校对:丁楠雅 本文约4000字,建议阅读10分钟. 本文介绍了在提取出想要的数据之后,如何将数据导出成其他格式的方法. 有很多时候你会想用Python从 ...
- 删除PDF文件中的空白页面
一.mobi文件转换成pdf文件 接到一个任务,将mobi文件转换成pdf文件,手机中下载了一个软件,大概是一个什么阅读器,需要注册登录,然后送了10次转换机会,转出来的pdf能看,但是文件里面有很多 ...
最新文章
- Tengine高性能部署之—日志分割
- python资料书-史上最全Python从入门到资深书籍资料分享!
- MVVM架构~knockoutjs系列之验证成功提示显示
- Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
- mysql数据库项目化教程郑小蓉_MySQL数据库项目化教程(高等职业教育“十三五”规划教材(软件技术专业))...
- layui 表单动态添加、删除input框
- 同学的博客,没想到也这么多文章。
- linux怎么测试一个脚本,一个Linux中用于监控的简易shell脚本
- 单麦克纳姆轮的速度分解
- DOM对象转化成jQuery对象 $(参数) (能不能查到jQuery对象的所有方法)
- 火星地形地貌图,摄影:“祝融号”火星车
- 二维随机变量期望公式_多维随机变量的特征数
- 在计算机操作系统中操作系统是处于应用软件,计算机操作系统考试复习题
- SP_Flash_Tool_For_win10
- MySQL数据库字段级权限设计
- 记一个阿里巴巴 平台型产品经理 面试
- 应用案例 | 2011款保时捷卡宴3.0T车发动机怠速间歇性抖动故障诊断
- centos7对普通用户授权sudo权限
- 【2018.12.14】python3.7 一个低级趣味的爬虫(requests+pyquery)妹纸的图哇咔咔
- MATLAB中的set函数
热门文章
- 玩消费电子产品,常用6款传感器不可不知
- 某K字头运动软件逆向分析-课程精讲
- SLF4J: Failed toString() invocation on an object of type [org.eclipse.jetty.websocket.server......
- SCM系统有什么好处?
- 专业应用软件随身带,一招助您轻松搞定客户
- 6. 多列布局column
- Visual Studio Code 多开
- SyncNavigator(数据库同步软件)介绍以及使用说明
- 对win7进行网络渗透
- Advanced IP Scanner –免费的轻量级Windows端口扫描器