1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > PDF定位关键字/词所在坐标及页码

PDF定位关键字/词所在坐标及页码

时间:2023-03-31 07:12:28

相关推荐

PDF定位关键字/词所在坐标及页码

因为功能需要在pdf文件上添加一个日期文本,找了好多资源,总算功夫不负有心人,总算让我找到一篇博客/tankqiu/p/4339079.html?utm_source=tuicool,于是博主满心欢喜,马上去实践:

import java.io.IOException;import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.ImageRenderInfo;import com.itextpdf.text.pdf.parser.PdfReaderContentParser;import com.itextpdf.text.pdf.parser.RenderListener;import com.itextpdf.text.pdf.parser.TextRenderInfo;public class Demo{// 定义关键字private static String KEY_WORD = "KEYWORD";// 定义返回值private static float[] resu = null;// 定义返回页码private static int i = 0;/** 返回关键字所在的坐标和页数 float[0] >> X float[1] >> Y float[2] >> page*/private float[] getKeyWords(String filePath){try{PdfReader pdfReader = new PdfReader(filePath);int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);// 下标从1开始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)){Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();resu = new float[3];resu[0] = boundingRectange.x;resu[1] = boundingRectange.y;resu[2] = i;}}@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}});}} catch (IOException e){// TODO Auto-generated catch blocke.printStackTrace();}return resu;}}

实际运行时,发现如何都定位不到我想要定位的地方,然后我又去这个博客翻了翻,结果在评论下方找到了答案:

果然,不能一味的抄袭和引用。无奈,我又去恶补了一下itxt,发现TextRenderInfo每次读取的不一定是一个字,有时候可能是一个词,也有可能是一行。原来,TextRenderInfo每次读取到的都是chunk(文本块)里的内容!好吧,既然问题找到了,那就解决问题,于是经过我的不懈改造,代码变成了下面这个样子:

package com.example.web.utils;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.List;import org.springframework.util.StringUtils;import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.ImageRenderInfo;import com.itextpdf.text.pdf.parser.PdfReaderContentParser;import com.itextpdf.text.pdf.parser.RenderListener;import com.itextpdf.text.pdf.parser.TextRenderInfo;public class PDFUtils{// 定义关键词private static String KEY_WORD = "日期:";// 定义返回值private static float[] resu = null;// 定义返回页码private static int i = 0;//定义关键字数组private static String[] WORD = null;//定义关键字数组长度private static int index = 0;//返回结果private static ListresultList = Collections.synchronizedList(new ArrayList());/** 返回关键字所在的坐标和页数 float[0] >> X float[1] >> Y float[2] >> page*/private ListgetKeyWords(String filePath, String keyWord){if(!StringUtils.isEmpty(keyWord)){KEY_WORD = keyWord;}try{PdfReader pdfReader = new PdfReader(filePath);int pageNum = pdfReader.getNumberOfPages();PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);// 下标从1开始for (i = 1; i <= pageNum; i++){WORD = KEY_WORD.split("");index = WORD.length;pdfReaderContentParser.processContent(i, new RenderListener(){boolean f = false;//是否寻找到与之匹配的的头文字int p = 1;@Overridepublic void renderText(TextRenderInfo textRenderInfo){String text = textRenderInfo.getText();//doc转PDF//原理:textRenderInfo只能读取到一个字符,而我们要匹配的关键词往往是多个字符,所以分析后设计匹配关键词方法如下,//先匹配关键词的第一个字符if (null != text && text.contains(WORD[p]) && text.length()==1){//匹配到关键字第一个字符,可以进行关键字完整匹配流程if(p==1){f = true;}String str = WORD[p];if(pt = ut.getKeyWords("d:/test.pdf","日期");for (float[] fs : t) {System.out.println("X>>" + fs[0] + "Y>>" +fs[1]+ "Page>>" + fs[2]);}}}

经过测试,成功打印出结果:

X>>466.0Y>>10.0Page>>0.0

第一次写博客,有很多描述不全的地方,大家如果有什么不明白的地方,尽管在下方留言,我看到后会一一回复。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。