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关键字所在页码及其坐标,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
java查找pdf关键字_java实现查找PDF关键字所在页码及其坐标相关推荐
- java 设置pdf 编码格式_Java如何设置PDF文档背景色详解
前言 一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景 设 ...
- java html pdf 中文_java html 转pdf 中文可显示
摘要: 最近正好项目有用到 ITEXT ,在网络上搜索了一番,发现了很多方案,但是都是显示中文有问题,本文提供一种最便捷的方式来实现,不需要任何额外 JAR 包. 引用一句另外一个人提出解决方式的一句 ...
- java中的me关键字_java中的volatile关键字
一.详细解释 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并 ...
- java 中特殊的_Java中一些特殊关键字
transient 被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null. ins ...
- 什么是java的关键字_java中常见的关键字
什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...
- java 查找关键字_java实现简单的关键字查找
需求:从一个指定的字符串中,查找是否存在指定的关键字,有则将其按顺序找出.例如:从"我在开会,一会打电话,然后去吃饭" 查找是否含有 "教研"."上课 ...
- java版 pdf转换_java如何将pdf转换成image
java如何将pdf转换成image 发布时间:2020-08-26 03:05:15 来源:脚本之家 阅读:86 作者:yiluoak_47 本文实例为大家分享了java将pdf转换image的具体 ...
- java面试宝典pdf下载_Java面试问答PDF电子书免费下载(250+问题,60页)
java面试宝典pdf下载 I was getting a lot of emails and comments to create java interview questions and answ ...
- java读pdf一行_java读与pdf白件的时分呈现非常
java读与pdf白件的时分呈现非常 (2011-06-25 09:45:53) 标签: 淑女屋 丝塔芙 杂谈 Exception in thread "main" java.la ...
- java提取pdf题目_java读取doc,pdf问题。
展开全部 PDFBox是一个开源的对pdf文件进行操作的库. PDFBox-0.7.3.jar加入classpath.同时FontBox1.0.jar加入classpath,否则报错626169647 ...
最新文章
- 多面体的顶点方向以及分解定理以及多胞形凸组合
- python模块引用
- Ocelot.JwtAuthorize:一个基于网关的Jwt验证包
- ArcGIS API for Silverlight中legend控件显示图例问题
- 怎么把好几行弄成一行_我在git merge的时候遇到了冲突,怎么解决?
- 设计模式学习笔记(1)——单例模式
- C++之文件操作探究(二):读文件——文本文件
- 电阻带行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- Android - 返回上一个界面finish()方法
- host-only局域网络
- Docker中配置国内镜像
- 使用Notepad2替代系统笔记本
- error: ‘__ATOMIC_RELAXED’ undeclared (first use in this function)
- iOS 开发 申请299美金企业开发账号
- 机器学习数据分析极简思路及sklearn算法小试
- 安卓开发中的一些经验总结
- 企业运维之七层负载均衡--Haproxy
- 单位冲激信号 matlab,matlab单位冲激序列
- 华南理工大学数学专业考研试题参考解答
- VMware设置虚拟机与物理主机处于同一网段,桥接模式
热门文章
- JavaScript prototype原型实现继承
- 微信自动回复 html 点击文字,【微信开发】公众号自动回复文字和图文链接(示例代码)...
- adams2015怎么把工具栏打开_PDF旋转后保存,打开为什么还是旋转前的方向?
- Java微信授权登陆
- 计算机cpu的字母,笔记本计算机CPU型号后缀字母HQ,U,Y的详细说明
- xp启用计算机共享打印机,Win7如何共享xp的打印机
- UVA 177 Paper Folding
- 独立的自动化智能系统——海格里斯(HEGERLS)直线双轨多层机器人RGV穿梭车
- 2007全球前50佳网站
- 深度学习图像分类数据集制作