如何使用java实现查找PDF关键字所在页码及其坐标
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章给大家分享的是有关如何使用java实现查找PDF关键字所在页码及其坐标的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、因为最近有这方面的需求,用过之后记录一下。2
千家信息网最后更新 2026年11月03日如何使用java实现查找PDF关键字所在页码及其坐标
这篇文章给大家分享的是有关如何使用java实现查找PDF关键字所在页码及其坐标的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
1、因为最近有这方面的需求,用过之后记录一下。
2、此功能跟PDF中Ctrl+F性质一样,如果PDF中为图片形式的不支持定位到关键字。
import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfDictionary;import com.itextpdf.text.pdf.PdfName;import com.itextpdf.text.pdf.PdfReader;import com.itextpdf.text.pdf.parser.*;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.ArrayList;import java.util.List;/** * 消失的太阳 */public class MyTest { public static void main(String[] args) throws IOException { //1.给定文件 File pdfFile = new File("D://test.pdf"); //2.定义一个byte数组,长度为文件的长度 byte[] pdfData = new byte[(int) pdfFile.length()]; //3.IO流读取文件内容到byte数组 FileInputStream inputStream = null; try { inputStream = new FileInputStream(pdfFile); inputStream.read(pdfData); } catch (IOException e) { throw e; } finally { if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { } } } //4.指定关键字 String keyword = "消失的太阳:"; //5.调用方法,给定关键字和文件 List positions = findKeywordPostions(pdfData, keyword); //6.返回值类型是 List 每个list元素代表一个匹配的位置,分别为 float[0]所在页码 float[1]所在x轴 float[2]所在y轴 System.out.println("total:" + positions.size()); if (positions != null && positions.size() > 0) { for (float[] position : positions) { System.out.print("pageNum: " + (int) position[0]); System.out.print("\tx: " + position[1]); System.out.println("\ty: " + position[2]); } } } /** * findKeywordPostions * @param pdfData 通过IO流 PDF文件转化的byte数组 * @param keyword 关键字 * @return List : float[0]:pageNum float[1]:x float[2]:y * @throws IOException */ public static List findKeywordPostions(byte[] pdfData, String keyword) throws IOException { List result = new ArrayList<>(); List pdfPageContentPositions = getPdfContentPostionsList(pdfData); for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) { List charPositions = findPositions(keyword, pdfPageContentPosition); if (charPositions == null || charPositions.size() < 1) { continue; } result.addAll(charPositions); } return result; } private static List getPdfContentPostionsList(byte[] pdfData) throws IOException { PdfReader reader = new PdfReader(pdfData); List result = new ArrayList<>(); int pages = reader.getNumberOfPages(); for (int pageNum = 1; pageNum <= pages; pageNum++) { float width = reader.getPageSize(pageNum).getWidth(); float height = reader.getPageSize(pageNum).getHeight(); PdfRenderListener pdfRenderListener = new PdfRenderListener(pageNum, width, height); //解析pdf,定位位置 PdfContentStreamProcessor processor = new PdfContentStreamProcessor(pdfRenderListener); PdfDictionary pageDic = reader.getPageN(pageNum); PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES); try { processor.processContent(ContentByteUtils.getContentBytesForPage(reader, pageNum), resourcesDic); } catch (IOException e) { reader.close(); throw e; } String content = pdfRenderListener.getContent(); List charPositions = pdfRenderListener.getcharPositions(); List positionsList = new ArrayList<>(); for (CharPosition charPosition : charPositions) { float[] positions = new float[]{charPosition.getPageNum(), charPosition.getX(), charPosition.getY()}; positionsList.add(positions); } PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions(); pdfPageContentPositions.setContent(content); pdfPageContentPositions.setPostions(positionsList); result.add(pdfPageContentPositions); } reader.close(); return result; } private static List findPositions(String keyword, PdfPageContentPositions pdfPageContentPositions) { List result = new ArrayList<>(); String content = pdfPageContentPositions.getContent(); List charPositions = pdfPageContentPositions.getPositions(); for (int pos = 0; pos < content.length(); ) { int positionIndex = content.indexOf(keyword, pos); if (positionIndex == -1) { break; } float[] postions = charPositions.get(positionIndex); result.add(postions); pos = positionIndex + 1; } return result; } private static class PdfPageContentPositions { private String content; private List positions; public String getContent() { return content; } public void setContent(String content) { this.content = content; } public List getPositions() { return positions; } public void setPostions(List positions) { this.positions = positions; } } private static class PdfRenderListener implements RenderListener { private int pageNum; private float pageWidth; private float pageHeight; private StringBuilder contentBuilder = new StringBuilder(); private List charPositions = new ArrayList<>(); public PdfRenderListener(int pageNum, float pageWidth, float pageHeight) { this.pageNum = pageNum; this.pageWidth = pageWidth; this.pageHeight = pageHeight; } public void beginTextBlock() { } public void renderText(TextRenderInfo renderInfo) { List characterRenderInfos = renderInfo.getCharacterRenderInfos(); for (TextRenderInfo textRenderInfo : characterRenderInfos) { String word = textRenderInfo.getText(); if (word.length() > 1) { word = word.substring(word.length() - 1, word.length()); } Float rectangle = textRenderInfo.getAscentLine().getBoundingRectange(); float x = (float)rectangle.getX(); float y = (float)rectangle.getY();// float x = (float)rectangle.getCenterX();// float y = (float)rectangle.getCenterY();// double x = rectangle.getMinX();// double y = rectangle.getMaxY(); //这两个是关键字在所在页面的XY轴的百分比 float xPercent = Math.round(x / pageWidth * 10000) / 10000f; float yPercent = Math.round((1 - y / pageHeight) * 10000) / 10000f;// CharPosition charPosition = new CharPosition(pageNum, xPercent, yPercent); CharPosition charPosition = new CharPosition(pageNum, (float)x, (float)y); charPositions.add(charPosition); contentBuilder.append(word); } } public void endTextBlock() { } public void renderImage(ImageRenderInfo renderInfo) { } public String getContent() { return contentBuilder.toString(); } public List getcharPositions() { return charPositions; } } private static class CharPosition { private int pageNum = 0; private float x = 0; private float y = 0; public CharPosition(int pageNum, float x, float y) { this.pageNum = pageNum; this.x = x; this.y = y; } public int getPageNum() { return pageNum; } public float getX() { return x; } public float getY() { return y; } @Override public String toString() { return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y + "]"; } }} 感谢各位的阅读!关于"如何使用java实现查找PDF关键字所在页码及其坐标"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
关键
关键字
所在
文件
页码
内容
数组
坐标
位置
太阳
更多
篇文章
长度
定位
不错
实用
两个
代表
元素
功能
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
科技互联网企业
A股互联网金融科技公司
互联网是不是新科技
华宇互联网科技
互联网科技logo
广州紫鲸互联网科技
哈尔滨新华互联网科技
济南和联互联网科技有限公司
互联网和高科技公司
江苏南京365互联网科技
互联网科技实习生岗位职责
世界互联网科技公司市值排名
浙江互联网科技研学营
荆州市昕露互联网络科技有限公司
成都互联网科技公司工作好不好
互联网金融科技展
东莞新华互联网科技学校
上海创道互联网络科技有限公司
互联网科技包装股
西安有哪些互联网高科技企业
新华互联网科技学校
互联网科技公司的优势
互联网属科技
科技互联网政务服务
礼当家互联网科技
安徽鑫晟辉互联网科技
承德科技产业互联网发展
受益于互联网科技的高速发展
彤创互联网科技有限公司
江阴互联网智能科技产品进口