代码先锋网 代码片段及技术文章聚合

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

技术标签: pdf  定位  坐标

因为功能需要在pdf文件上添加一个日期文本,找了好多资源,总算功夫不负有心人,总算让我找到一篇博客http://www.cnblogs.com/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()
                {

                    @Override
                    public 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;
                        }
                    }

                    @Override
                    public void renderImage(ImageRenderInfo arg0)
                    {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void endTextBlock()
                    {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void beginTextBlock()
                    {
                        // TODO Auto-generated method stub

                    }
                });
            }
        } catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.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 List resultList = Collections.synchronizedList(new ArrayList());

    /*
     * 返回关键字所在的坐标和页数 float[0] >> X float[1] >> Y float[2] >> page
     */
    private List getKeyWords(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;
                    @Override
                    public 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(p t = 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

第一次写博客,有很多描述不全的地方,大家如果有什么不明白的地方,尽管在下方留言,我看到后会一一回复。
版权声明:本文为guo123k原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/guo123k/article/details/76417702

智能推荐

java查找PDF关键字坐标 并且标记出来

java查找PDF关键字坐标 并且标记出来 导入POM依赖 代码 关键点说明 导入POM依赖 代码 关键点说明 itextpdf中坐标系为第一象限,原点在每页的左下角 TextExtractionStrategy ,自定义MyTextExtractionStrategy,通过renderText方法可以获取位置和字体信息; 每页分开判断,此代码例子中,关键词判断通过每页内容字符串.indexOf来...

shell 查找指定路径下包含特定关键字的文件,并输出关键字所在文件及所在行

xxxxxx91116 2013-04-25 20:37:30 4676 收藏 2 展开 #!/bin/bash #作者:zxx #日期:2013.04.25 #功能描述:在FIND_PATH路径下查找包含关键字SOURCE的文件,并列出所在行,SOURCE由用>户输入,写的目的是为了读源码方便 #查找文件都在这个路径下面 FIND_PATH="/home/zxx/毕设/毕业设计/...

pdf电子签章+关键字匹配定位+多签章方式

    前言     代码很多都是参考网上有的(参考借鉴了下),融入自己遇到的需求,整理了下, 让大家少走点弯路。里面很多注释 没有详细注释,是因为带着关键字,百度很容易搜到解释。     最主要的核心就是定位。虽然不能百分百解决,但是实用性还是有的     maven依赖   签章主方法 依赖类  ...

pdfBox获取关键字坐标

pdfBox获取关键字坐标 前言 具体实现 所需要的jar包 具体代码 主方法 坐标获取类 代码中涉及到一个关键字的处理,由于PDF中可能关键字会多次出现,因此最好做一个处理,要不选择当页最后出现的地方盖章,要不就是判断字数,当然 具体情况具体考虑。...

猜你喜欢

文本敏感词、关键字检测

背景 在做一些跟内容相关的项目的时候,经常需要对内容文本中的内容进行检测,检测文本中是否包含某个敏感、违法等词汇,例如“贷款”、“发票”之类的。有些狡猾的用户可能知道“贷款”在你的系统中是敏感词,不能审核通过,便使用“贷 款”、“贷$款”、"贷;款"等这种方式...

pdf读取关键字的方法

package com.fineway.hcs.file.util; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.ImageRenderInfo; import com.itextpdf.text.pdf.parser.PdfReaderContentParser; import com.i...

记录:PDF关键字寻找

关于获取PDF中关键字位置可以直接用的demo 转载于:https://www.jianshu.com/p/60a72111ba85...