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关键字所在页码及其坐标相关推荐

  1. java 设置pdf 编码格式_Java如何设置PDF文档背景色详解

    前言 一般生成的PDF文档默认的文档底色为白色,我们可以通过一定方法来更改文档的背景色,以达到文档美化以及保护双眼的作用. 以下内容提供了Java编程来设置PDF背景色的方法.包括: 设置纯色背景 设 ...

  2. java html pdf 中文_java html 转pdf 中文可显示

    摘要: 最近正好项目有用到 ITEXT ,在网络上搜索了一番,发现了很多方案,但是都是显示中文有问题,本文提供一种最便捷的方式来实现,不需要任何额外 JAR 包. 引用一句另外一个人提出解决方式的一句 ...

  3. java中的me关键字_java中的volatile关键字

    一.详细解释 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并 ...

  4. java 中特殊的_Java中一些特殊关键字

    transient 被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后, transient 变量的值被设为初始值, 如 int 型的是 0,对象型的是 null. ins ...

  5. 什么是java的关键字_java中常见的关键字

    什么是关键字呢? 概述:关键字就是在java语言中赋予特殊含义的单词 特点:1.组成的关键字的单词全是小写 2.常见的代码编辑器中,对关键字都有特殊的颜色标记 比如在idea中对关键字都有特殊的颜色标 ...

  6. java 查找关键字_java实现简单的关键字查找

    需求:从一个指定的字符串中,查找是否存在指定的关键字,有则将其按顺序找出.例如:从"我在开会,一会打电话,然后去吃饭" 查找是否含有 "教研"."上课 ...

  7. java版 pdf转换_java如何将pdf转换成image

    java如何将pdf转换成image 发布时间:2020-08-26 03:05:15 来源:脚本之家 阅读:86 作者:yiluoak_47 本文实例为大家分享了java将pdf转换image的具体 ...

  8. java面试宝典pdf下载_Java面试问答PDF电子书免费下载(250+问题,60页)

    java面试宝典pdf下载 I was getting a lot of emails and comments to create java interview questions and answ ...

  9. java读pdf一行_java读与pdf白件的时分呈现非常

    java读与pdf白件的时分呈现非常 (2011-06-25 09:45:53) 标签: 淑女屋 丝塔芙 杂谈 Exception in thread "main" java.la ...

  10. java提取pdf题目_java读取doc,pdf问题。

    展开全部 PDFBox是一个开源的对pdf文件进行操作的库. PDFBox-0.7.3.jar加入classpath.同时FontBox1.0.jar加入classpath,否则报错626169647 ...

最新文章

  1. 多面体的顶点方向以及分解定理以及多胞形凸组合
  2. python模块引用
  3. Ocelot.JwtAuthorize:一个基于网关的Jwt验证包
  4. ArcGIS API for Silverlight中legend控件显示图例问题
  5. 怎么把好几行弄成一行_我在git merge的时候遇到了冲突,怎么解决?
  6. 设计模式学习笔记(1)——单例模式
  7. C++之文件操作探究(二):读文件——文本文件
  8. 电阻带行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  9. Android - 返回上一个界面finish()方法
  10. host-only局域网络
  11. Docker中配置国内镜像
  12. 使用Notepad2替代系统笔记本
  13. error: ‘__ATOMIC_RELAXED’ undeclared (first use in this function)
  14. iOS 开发 申请299美金企业开发账号
  15. 机器学习数据分析极简思路及sklearn算法小试
  16. 安卓开发中的一些经验总结
  17. 企业运维之七层负载均衡--Haproxy
  18. 单位冲激信号 matlab,matlab单位冲激序列
  19. 华南理工大学数学专业考研试题参考解答
  20. VMware设置虚拟机与物理主机处于同一网段,桥接模式

热门文章

  1. JavaScript prototype原型实现继承
  2. 微信自动回复 html 点击文字,【微信开发】公众号自动回复文字和图文链接(示例代码)...
  3. adams2015怎么把工具栏打开_PDF旋转后保存,打开为什么还是旋转前的方向?
  4. Java微信授权登陆
  5. 计算机cpu的字母,笔记本计算机CPU型号后缀字母HQ,U,Y的详细说明
  6. xp启用计算机共享打印机,Win7如何共享xp的打印机
  7. UVA 177 Paper Folding
  8. 独立的自动化智能系统——海格里斯(HEGERLS)直线双轨多层机器人RGV穿梭车
  9. 2007全球前50佳网站
  10. 深度学习图像分类数据集制作