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

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改关键字的坐标了。



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值