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);
 // 当前页找不到,到前一页查询

if(null == matchItem){
pageNumber =pageNumber -1;
renderListener.setPageNumber(pageNumber);
renderListener.setCurPageSize(rectangle);
parse.processContent(pageNumber, renderListener);
matchItem = findKeywordItems(renderListener, keyword);
}
matchItem.setPageNum(pageNumber);
return matchItem;

}

/**
找到匹配的关键词块
@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文件中找关键字的坐标相关推荐

  1. 查找多个 PDF 文件中的关键字并替换为其它文字

    概要:在一个文件中查找并替换关键字的场景下,我们都知道怎么去操作,我们直接按住Ctrl+F5或者直接按软件界面上的查找按钮,并且替换就可以了.但是如果我们需要一次性的查找并替换PDF文件中的多个关键字 ...

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

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

  3. grep检索关键字的命令_文件中查找关键字“ ”命令 grep

    sudo grep -irn 'COMPILE'  .  //  "." 当前目录下 关键字为'COMPILE' sudo grep -i 'COMPILE'    ltls.c ...

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

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

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

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

  6. 使用itext7在PDF文件中的指定文字位置添加电子签名图片技术记录

    使用itext7在PDF文件中的指定文字位置添加电子签名图片 文章目录 使用itext7在PDF文件中的指定文字位置添加电子签名图片 一.技术使用背景 二.使用步骤 1.引入依赖 2.具体代码 2.控 ...

  7. 用友t3服务器文件丢失,用友T3软件在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决?-用友T3...

    文章摘要:用友T3软件在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决?在T3用友通标准版恢复账套时在备份的文件中找不到要恢复的文件,如何解决? 问题模块: 系统管理关键字:备份 ...

  8. 手把手教你如何用Python从PDF文件中导出数据(附链接)

    作者:Mike Driscoll :翻译:季洋:校对:丁楠雅 本文约4000字,建议阅读10分钟. 本文介绍了在提取出想要的数据之后,如何将数据导出成其他格式的方法. 有很多时候你会想用Python从 ...

  9. 删除PDF文件中的空白页面

    一.mobi文件转换成pdf文件 接到一个任务,将mobi文件转换成pdf文件,手机中下载了一个软件,大概是一个什么阅读器,需要注册登录,然后送了10次转换机会,转出来的pdf能看,但是文件里面有很多 ...

最新文章

  1. Tengine高性能部署之—日志分割
  2. python资料书-史上最全Python从入门到资深书籍资料分享!
  3. MVVM架构~knockoutjs系列之验证成功提示显示
  4. Linux网络编程 | Socket编程(一):Socket的介绍、UDPSocket的封装、UDP服务器/客户端的实现
  5. mysql数据库项目化教程郑小蓉_MySQL数据库项目化教程(高等职业教育“十三五”规划教材(软件技术专业))...
  6. layui 表单动态添加、删除input框
  7. 同学的博客,没想到也这么多文章。
  8. linux怎么测试一个脚本,一个Linux中用于监控的简易shell脚本
  9. 单麦克纳姆轮的速度分解
  10. DOM对象转化成jQuery对象 $(参数) (能不能查到jQuery对象的所有方法)
  11. 火星地形地貌图,摄影:“祝融号”火星车
  12. 二维随机变量期望公式_多维随机变量的特征数
  13. 在计算机操作系统中操作系统是处于应用软件,计算机操作系统考试复习题
  14. SP_Flash_Tool_For_win10
  15. MySQL数据库字段级权限设计
  16. 记一个阿里巴巴 平台型产品经理 面试
  17. 应用案例 | 2011款保时捷卡宴3.0T车发动机怠速间歇性抖动故障诊断
  18. centos7对普通用户授权sudo权限
  19. 【2018.12.14】python3.7 一个低级趣味的爬虫(requests+pyquery)妹纸的图哇咔咔
  20. MATLAB中的set函数

热门文章

  1. 玩消费电子产品,常用6款传感器不可不知
  2. 某K字头运动软件逆向分析-课程精讲
  3. SLF4J: Failed toString() invocation on an object of type [org.eclipse.jetty.websocket.server......
  4. SCM系统有什么好处?
  5. 专业应用软件随身带,一招助您轻松搞定客户
  6. 6. 多列布局column
  7. Visual Studio Code 多开
  8. SyncNavigator(数据库同步软件)介绍以及使用说明
  9. 对win7进行网络渗透
  10. Advanced IP Scanner –免费的轻量级Windows端口扫描器