因为功能需要在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 版权协议,转载请附上原文出处链接和本声明。