精华内容
下载资源
问答
  • 2、此功能跟PDF中Ctrl+F性质一样,如果PDF中为图片形式的不支持定位到关键字。import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfDictionary;import com.itextpdf.text.pdf.PdfName;...

    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关键字所在页码及其坐标,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

    如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

    展开全文
  • packagecom.alphajuns.util;importcom.itextpdf.text.pdf.PdfReader;importcom.itextpdf.text.pdf.parser....importjava.io.IOException;/*** @ClassName PdfHelper* @Description Pdf帮助类* @Aut...

    packagecom.alphajuns.util;importcom.itextpdf.text.pdf.PdfReader;importcom.itextpdf.text.pdf.parser.PdfReaderContentParser;importjava.io.IOException;/*** @ClassName PdfHelper

    * @Description Pdf帮助类

    * @Author AlphaJunS

    * @Date 2020/3/7 17:40

    * @Version 1.0*/

    public classPdfHelper {/*** @Author AlphaJunS

    * @Date 18:24 2020/3/7

    * @Description 用于供外部类调用获取关键字所在PDF文件坐标

    *@paramfilepath

    *@paramkeyWords

    *@returnfloat[]*/

    public static float[] getKeyWordsByPath(String filepath, String keyWords) {float[] coordinate = null;try{

    PdfReader pdfReader= newPdfReader(filepath);

    coordinate=getKeyWords(pdfReader, keyWords);

    }catch(IOException e) {

    e.printStackTrace();

    }returncoordinate;

    }/*** @Author AlphaJunS

    * @Date 18:26 2020/3/7

    * @Description 获取关键字所在PDF坐标

    *@parampdfReader

    *@paramkeyWords

    *@returnfloat[]*/

    private static float[] getKeyWords(PdfReader pdfReader, String keyWords) {float[] coordinate = null;int page = 0;try{int pageNum =pdfReader.getNumberOfPages();

    PdfReaderContentParser pdfReaderContentParser= newPdfReaderContentParser(pdfReader);

    CustomRenderListener renderListener= newCustomRenderListener();

    renderListener.setKeyWord(keyWords);for (page = 1; page <= pageNum; page++) {

    renderListener.setPage(page);

    pdfReaderContentParser.processContent(page, renderListener);

    coordinate=renderListener.getPcoordinate();if (coordinate != null) break;

    }

    }catch(IOException e) {

    e.printStackTrace();

    }returncoordinate;

    }

    }

    展开全文
  • 根据指定关键字获取坐标:1.使用的是 itextpdf ,所用依赖:com.itextpdfitextpdf5.5.62.获取坐标代码:package test;import java.io.IOException;import java.util.ArrayList;import java.util.List;import ...

    根据指定关键字获取坐标:

    1.使用的是 itextpdf ,所用依赖:

    com.itextpdf

    itextpdf

    5.5.6

    2.获取坐标代码:

    package test;

    import java.io.IOException;

    import java.util.ArrayList;

    import java.util.List;

    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 Test {

    // 指定关键字

    public static String KEY_WORD = "总计:";

    // PDF当前页数

    public static int curPage = 0;

    // 集合里放了多少条数据

    public static int count = 0;

    // 坐标信息集合

    public static List arrays = new ArrayList();

    // 关键字字符数组

    public static char[] charArray = KEY_WORD.toCharArray();

    /**

    * 获取指定PDF文件中指定关键字的坐标

    *

    * @param filePath

    * @return

    * @throws Exception

    */

    public static List getKeyWordCoordinate(String filePath) throws Exception {

    if (charArray.length < 2) {

    throw new Exception("关键字长度不能小于2");

    }

    PdfReader pdfReader = null;

    try {

    pdfReader = new PdfReader(filePath);

    int pageNum = pdfReader.getNumberOfPages();

    PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);

    for (curPage = 1; curPage <= pageNum; curPage++) {

    pdfReaderContentParser.processContent(curPage, new RenderListener() {

    // 关键字标志

    boolean isKeyWord = false;

    // PDF读出来的文字与截取关键字的第index位对比,如果在关键字的长度里

    /**

    * 这里从PDF中是一个一个读取文字的,把读取出来的PDF文字先和关键字的第一个字比较看是否相同:

    * 如果相同,则假设已经找到关键字(将isKeyWord设为true),把这个关键字的坐标存到集合里面,并计算集合里存放了多少个数据(count++)、设置进入到一个循环(loop

    * = true一个循环即为关键字从第一个字到最后一个字依次和读取的PDF文字比较的过程);

    * 如果在这个比较过程中发现有的字符和关键字不匹配,则移除与之对应的集合里的数据。

    */

    // 关键字的第几位

    int index = 0;

    // 对比关键字是否进入到一个循环

    boolean loop = false;

    // 处理数据

    public void renderText(TextRenderInfo textRenderInfo) {

    String text = textRenderInfo.getText();

    if (text.equals(new String(charArray, 0, 1)) && text != null) {

    // 把当前从PDF文件中读取的文字横坐标、纵坐标和当前页存到集合里面

    Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange();

    float[] resu = new float[3];

    resu[0] = boundingRectange.x;

    resu[1] = boundingRectange.y;

    resu[2] = curPage;

    arrays.add(resu);

    count++;

    isKeyWord = true;

    loop = true;

    return;

    }

    if (isKeyWord) {

    // 获取关键字中下一个字符和读取文字比较

    index++;

    if (index < charArray.length) {

    if (text.equalsIgnoreCase(new String(charArray, index, 1)) && text != null) {

    isKeyWord = true;

    return;

    } else {

    isKeyWord = false;

    // 如果在一个循环中比较时,发现有字符和关键字不匹配,则移除与之对应的集合里的数据

    if (loop) {

    count--;

    arrays.remove(count);

    }

    }

    } else {

    // 如果index大于关键字字符数组的长度,则该循环结束

    loop = false;

    }

    }

    index = 0;

    }

    public void renderImage(ImageRenderInfo arg0) {

    }

    public void endTextBlock() {

    }

    public void beginTextBlock() {

    }

    });

    }

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    if (pdfReader != null) {

    pdfReader.close();

    }

    }

    return arrays;

    }

    //测试

    public static void main(String[] args) throws Exception {

    String filePath = "F:/test.pdf";

    List list = getKeyWordCoordinate(filePath);

    for (float[] f : list) {

    System.out.println("x坐标:" + f[0] + ",y坐标:" + f[1] + ", 关键字所在页:" + f[2]);

    }

    }

    }

    以上代码执行结果示例:

    需要注意的是:这里获取坐标的原点是PDF文件纵向显示时的左下角

    展开全文
  • importjava.util.ArrayList;importjava.util.List;importorg.apache.log4j.Logger;importorg.drools.util.StringUtils;importcom.itextpdf.awt.geom.Rectangle2D;importcom.itextpdf.text.Rectangle;importcom.itext...

    importjava.util.ArrayList;importjava.util.List;importorg.apache.log4j.Logger;importorg.drools.util.StringUtils;importcom.itextpdf.awt.geom.Rectangle2D;importcom.itextpdf.text.Rectangle;importcom.itextpdf.text.pdf.parser.ImageRenderInfo;importcom.itextpdf.text.pdf.parser.RenderListener;importcom.itextpdf.text.pdf.parser.TextRenderInfo;public class KeyWordPositionListener implementsRenderListener {private static Logger logger = Logger.getLogger(KeyWordPositionListener.class);private List matches = new ArrayList();private List allItems = new ArrayList();privateRectangle curPageSize;/*** 匹配的关键字*/

    privateString keyword;/*** 匹配的当前页*/

    privateInteger pageNumber;public voidbeginTextBlock() {//do nothing

    }public voidrenderText(TextRenderInfo renderInfo) {

    String content=renderInfo.getText();

    content= content.replace("

    .replace(">", "").replace("》", "").replace(")", "").replace(")", "").replace("、", "").replace(".", "")

    .replace(":", "").replace(":", "").replace(" ", "");

    Rectangle2D.Float textRectangle=renderInfo.getDescentLine().getBoundingRectange();

    MatchItem item= newMatchItem();

    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(!StringUtils.isEmpty(content)){if(content.equalsIgnoreCase(keyword)) {

    matches.add(item);

    }

    }else{

    item.setContent("空字符串");

    }

    allItems.add(item);//先保存所有的项

    }public voidendTextBlock() {//do nothing

    }public voidrenderImage(ImageRenderInfo renderInfo) {//do nothing

    }/*** 设置需要匹配的当前页

    *@parampageNumber*/

    public voidsetPageNumber(Integer pageNumber) {this.pageNumber =pageNumber;

    }/*** 设置需要匹配的关键字,忽略大小写

    *@paramkeyword*/

    public voidsetKeyword(String keyword) {this.keyword =keyword;

    }/*** 返回匹配的结果列表

    *@return

    */

    public ListgetMatches() {returnmatches;

    }voidsetCurPageSize(Rectangle rect) {this.curPageSize =rect;

    }public ListgetAllItems() {returnallItems;

    }public void setAllItems(ListallItems) {this.allItems =allItems;

    }

    }

    展开全文
  • 一、使用itextpdf 推荐使用com.itextpdfitextpdf5.5.13.1PdfKeyWordPosition.javapackage com.util;import com.itextpdf.awt.geom.Rectangle2D;import com.itextpdf.text.pdf.PdfDictionary;import ...
  • 获取 pdf 关键字坐标

    2021-03-16 15:49:48
    packageDemo.qd;importcom.itextpdf.awt.geom.Rectangle2D.Float;importcom.itextpdf.text.pdf.PdfDictionary;importcom.itextpdf.text.pdf....importcom.itextpdf.text.pdf.PdfReader;import com.itextpdf.tex...
  • java查找PDF关键字坐标 并且标记出来导入POM依赖代码关键点说明 导入POM依赖 <!--使用itextpdf,比pdfbox简单些--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>...
  • 本文将介绍如何通过Java程序来查找并高亮PDF中的文本。使用工具:Free Spire.PDF for Java(免费版)Jar文件获取及导入:方法1:官网 方法2:可通过Java代码示例import com.spire.pdf.*;import ...
  • packagecom.alphajuns.util;importcom.itextpdf.text.pdf.PdfReader;importcom.itextpdf.text.pdf.parser....importjava.io.IOException;/*** @ClassName CheckPdfHelper* @Description 校验PDF是否...
  • 使用组件:Spire.PDF for Java下载Spire.PDF for JAVA包并解压缩,然后从lib文件夹下导入Spire.Pdf.jar包到Java应用程序中。原PDF文档如下:import com.spire.pdf.*;import java.awt.*;import ...
  • java PDF批量替换关键词要求:将要替换的字段封装到一个类中,并规定字段名与PDF关键字的映射。准备:关键词信息类-----MatchItempackage pdf.replace;import lombok.Data;@Datapublic class MatchItem {//pdf页数...
  • Java查找并高亮PDF文本过程解析本文将介绍如何通过Java程序来查找并高亮PDF中的文本。使用工具:Free Spire.PDF for Java(免费版)Jar文件获取及导入:方法1:官网下载Jar文件包。下载后,解压,并将lib文件夹下的...
  • 本文实例为大家分享了javapdf模板的指定位置插入图片的具体代码,供大家参考,具体内容如下java操作pdf有个非常好用的库itextpdf,maven:com.itextpdfitextpdf5.5.6com.itextpdfitext-asian5.2.0思路:adobe的...
  • 前言 人人都想进大厂,当然我也不例外。早在春招的时候我就有向某某某大厂投岗了不少简历,可惜了,疫情期间都是远程...摸熟里边近30个分类的Java知识后,7月下旬鼓足勇气向抖音后端进击,123面(视频面)下来就像开挂
  • JAVA替换PDF文字

    2021-02-12 12:45:55
    1 importcom.itextpdf.text.BaseColor;2 importcom.itextpdf.text.Font;3 importcom.itextpdf.text.Rectangle;4 importcom.itextpdf.text.pdf.BaseFont;5 importcom.itextpdf.text.pdf.PdfContentByte;6 importcom.i...
  • itext替换PDF的原理就是找到要替换的文字,然后计算他的位置,在...public class PdfConversion {// 定义关键字private static String KEY_WORD = "张三";// 定义返回值private static float[] resu = null;// 定义...
  • 当iText使用PDfStamperin正常模式操作文档时,它可以(并且经常)重新排列现有的PDF对象.这显然打破了任何现有集成签名的哈希值.此外,必须签名的字节范围也会发生变化.这很可能是你的问题.当iText使用PDfStamperin追加...
  • Java实现PDF合同生成

    2020-12-30 22:00:59
    由于在工作中遇到了合同套打的需求,于是在之前 pdfBox获取关键字坐标 的基础上实现了,根据 pdf 模版来套打合同。 PDF合同表单生成 首先,需要确定合同是否可以套打,如果合同格式固定,需要添加数据内容一般不...
  • 这可能看起来是一个老问题,但是我花了半个小时搜索了所有的SO后才找到一个详尽的答案.我正在使用PDFBox,我想从PDF文件中提取所有文本以及每个字符串的坐标.我正在使用他们的PrintTextLocations示例...
  • 出神入化——SpringCloudAlibaba.pdf SpringCloud微服务架构笔记(一).pdf SpringCloud微服务架构笔记(二).pdf SpringCloud微服务架构笔记(三).pdf SpringCloud微服务架构笔记(四).pdf Dubbo框架RPC实现原理....
  • 可以说掌握这个pdf上的知识,面试问的基础知识无处左右,我凭借这个pdf拿下了OPPO/百度,京东,华为,美团,蚂蚁金服等互联网公司的offer。 下文中截图来源于朋友一个pdf版本的面经,把所以知识点的答案整理了下来,...
  • 一、这里我的思路是,在上传文件时候把数据库对应id存到Elasticsearch对应索引类型的id,然后利用工具类把pdf、word、excel文件内容存到Elasticsearch的id对应json里,返回所有文件id的list二、这里我封装了一个读取...
  • PDF指定位置添加文字有两种情况,一是已知指定位置的坐标(可在前台使用PDF.js计算得多,本文暂时不多介绍),二是使用工具类在PDF上查找关键字来得知坐标,本次使用的itextpdf工具类能够达到这一效果。...
  • 《揭秘Java虚拟机:JVM设计原理与实现》从源码角度解读HotSpot的内部实现机制,本书主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型。数据结构部分包括Java字节码文件格式、常量池解析、...
  • 揭秘Java虚拟机 JVM设计原理与实现 内容简介《揭秘Java虚拟机:JVM设计原理与实现》从源码角度解读HotSpot的内部实现机制,本版本主要包含三大部分——JVM数据结构设计与实现、执行引擎机制及内存分配模型。...
  • 导入itextpdf** 依赖 <!-- itextpdf --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.3</version> </...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,421
精华内容 8,168
关键字:

java实现搜索pdf关键字

java 订阅