您的位置:首页 > 编程语言 > Java开发

[Java] 利用xpdf库获取pdf文件的指定范围文本内容

2012-01-29 23:13 627 查看
======================================================

注:本文源代码点此下载

======================================================

[java] 利用xpdf库获取pdf文件的指定范围文本内容
posted on 2005-08-03 15:26
旁观者 阅读(3879)
评论(19)编辑
收藏
[java] 利用xpdf库获取pdf文件的指定范围文本内容
编写者
日期
关键词
郑昀@ultrapower
2005-8-2
java pdf xpdf
概述
读取pdf文件的某一部分文本内容,可以使用开源项目xpdf。
从java中调用xpdf,我们参照了《java抽取word。

pdf的四种武器》文章最后提到的办法。
总而言之,调用xpdf十分简单,下面讲一下xpdf的配置问题。
系统基础环境要求
下面是对运行xpdf软件服务的计算机的要求:
l您可以从以下位置下载并安装 xpdf分发版本-补丁3的win32版本:
ftp://ftp.foolabs.com/pub/xpdf/xpdf-3.00pl3-win32.zip
l还需要从以下位置下载并安装 xpdf针对中文简体的语言支持包:
ftp://ftp.foolabs.com/pub/xpdf/xpdf-chinese-simplified.tar.gz
(更多下载信息参考http://www.foolabs.com/xpdf/download.html)。
调用示范
下载完毕,请将xpdf-3.00pl3-win32.zip解压缩到c盘xpdf目录下,我们将以c:\xpdf作为xpdf的工作路径。
然后,请将xpdf-chinese-simplified.tar\xpdf-chinese-simplified的内容解压缩到xpdf根目录下的chinese-simplified目录中。
为了启用中文简体语言包,您必须将xpdf目录下的sample-xpdfrc文件另存为xpdfrc文件。
注意:此文件为配置文件,而且名称必须是xpdfrc。如果是别的名字,即使调用pdftotext.exe时,传入”-cfg xpdfrc2”来告诉xpdf配置文件的名字,好像pdftotext.exe也并没有使用这个配置文件。所以为了减少误解,请您将配置文件直接命名为xpdfrc。
修改配置文件一:
并在这个xpdfrc文件最后加上这么一段话:
多加这么一段配置:
#----- begin chinese simplified support package (2004-jul-27)
cidtounicodeadobe-gb1c:/xpdf/chinese-simplified/adobe-gb1.cidtounicode
unicodemap iso-2022-cnc:/publicinstall/xpdf/chinese-simplified/iso-2022-cn.unicodemap
unicodemap euc-cnc:/xpdf/chinese-simplified/euc-cn.unicodemap
unicodemap gbkc:/xpdf/chinese-simplified/gbk.unicodemap
cmapdiradobe-gb1c:/xpdf/chinese-simplified/cmap
tounicodedirc:/xpdf/chinese-simplified/cmap
#displaycidfontttadobe-gb1/usr/..../gkai00mp.ttf
#----- end chinese simplified support package
注意map文件的路径一定要正确。
修改配置文件二:
另外,配置文件中原先没有加上一个“textpagebreaks”控制。为了避免这个分页符号,我们需要在xpdfrc文件“text output control”下面加上这么一段话:
多加这么一段配置:
# if set to "yes", text extraction willinsertpage
# breaks(form feed characters) between pages.this
# defaults to "yes".
textpagebreaksno
设置textpagebreaks为no的意思是:在pdf文档的两页之间不加入分页符号。
之所以这样,是因为这个符号有时候会引起sax解析xml上的困难。
修改配置文件三:
配置文件中原先把textencoding注释了。这样默认的字符集是latin1。我们必须打开它,并且就是指定textencoding为utf-8,而不是gb2312。
调用示范
下面的代码,演示了利用xpdf工具集中的pdftotext应用程序读取test.pdf的从第100个字符到第300个字符。给pdftotext.exe的运行参数中,“"-q"”指的是不打印转换中的错误提示;“"-cfg", "xpdfrc"”指的是采用配置文件xpdfrc。
代码示范:
string path_to_xpdf="c:\\xpdf\\pdftotext.exe";
string filename="c:\\test.pdf";
int begin = 100;
int end = 300;
string strresponse = "";
string[] cmd = new string[]
{ path_to_xpdf,
"-cfg", "xpdfrc", "-q", filename, "-"};
process p = runtime.getruntime().exec(cmd);
bufferedinputstream bis = new bufferedinputstream(p.getinputstream());
inputstreamreader reader = new inputstreamreader(bis, "utf-8");
if(begin > 0)
{
// 跳过begin个字符
reader.skip(begin);
}
// 本次要读取的字符数
int nlengthread = end - begin;
if(nlengthread > 0)
{
// 准备好缓冲区
char [] buf = new char[nlengthread];
// 输出到缓冲区
int nlengthwritetobuffer = reader.read(buf);
reader.close();
// nlengthwritetobuffer就是当前读取到缓冲区的字符数
if(nlengthwritetobuffer > 0)
{
// 只有nlengthwritetobuffer大于0,才说明文档有内容
strresponse = new string(buf);
}
else
{
// 否则可能是到了文档结尾
strresponse = "pdf_eof_of_doc";
}
}
system.out.println("\t\r\n" + strresponse);
编写者
日期
关键词
郑昀@ultrapower
2005-8-2
java pdf xpdf
绿色通道:好文要顶关注我收藏该文与我联系



feedback
#1楼
回复 引用
2005-08-26 20:12 by lemon[未注册用户]
如果要按行读取pdf文件的内容应该怎么办?
#2楼[楼主]
回复 引用 查看
2005-08-26 22:23 by 让变化成为计划的一部分

你可以看 http://java.sun.com/j2se/1.4.2/docs/api/java/io/inputstreamreader.html以及http://java.sun.com/j2se/1.4.2/docs/api/java/io/bufferedinputstream.html 的inputstreamreader 和 bufferedinputstream定义,只能设定一次读取多少个字节。
所以只能自己先读过来,然后再找换行了。
#3楼
回复 引用
2005-09-03 19:24 by submarine[未注册用户]
如何不指定文本内容范围,读取整篇文章呢,缓冲区的大小不固定,会浪费存储空间吗?
#4楼
回复 引用
2005-09-03 19:34 by submarine[未注册用户]
我发现读取字符超过两千个左右,会出现末尾的字符全变成方框格,不知道什么原因。
#5楼[楼主]
回复 引用 查看
2005-09-05 10:19 by 让变化成为计划的一部分

我们的功能就是不提取所有字符,而是根据范围来的。
#6楼[楼主]
回复 引用 查看
2005-09-05 10:25 by 让变化成为计划的一部分

末尾的字符全变成方框格,请确定是否是源文件中是否有特殊格式的图片或者背景,请对多个pdf测试,排除对“两千”字符的猜测。
我这边读取几万都没事。当pdf开头有一个背景图片时,也会出现各种奇怪的字符,很正常。
#7楼
回复 引用
2005-09-07 21:07 by submarine[未注册用户]
ok啦,没问题,很感谢!!
#8楼
回复 引用
2006-02-24 10:38 by sanjifeng[未注册用户]
pdf文件為繁體中文,應該怎麼修改配置文件?
#9楼[楼主]
回复 引用 查看
2006-02-24 18:58 by 让变化成为计划的一部分

就像有xpdf-chinese-simplified.tar.gz一样,也有专门的繁体中文包,下载了之后,里面的文档有安装说明的。
#10楼
回复 引用
2006-02-25 15:46 by sanjifeng[未注册用户]
謝謝
已經解決了
#11楼
回复 引用
2006-06-22 14:07 by andy.fish[未注册用户]
有两个问题:
1、为什么我设置以下参数无效
int begin = 0;
int end = 10000;
不论end设多大,读出来的内容都是一样的。比如我end设置为15000,和设置为10000读取的内容都是一样的。
2、请问有什么方法可以读取整篇pdf的内容呢?
#12楼[楼主]
回复 引用 查看
2006-06-24 13:51 by 让变化成为计划的一部分

你能确定你的pdf文件内容一定大于10000字节吗?
#13楼
回复 引用
2006-07-12 13:07 by zyy[未注册用户]
如果想读取整个pdf,应该如何??
#14楼[楼主]
回复 引用 查看
2006-07-12 17:26 by 让变化成为计划的一部分

对文章中提到的操作做一个循环就可以了,直到读出的字节数为0,不就代表到了pdf文件结尾吗?
#15楼
回复 引用
2007-03-12 19:28 by cwest[未注册用户]
请教
如何让显示在pdf中的内容,动态换行?我目前是一个文本框中的内容太长,如何让它自动换行?
#16楼[楼主]
回复 引用 查看
2007-03-14 18:27 by 让变化成为计划的一部分

to cwest:
您用xpdf吗?本文讲述的是xpdf的代码用法。
#17楼
回复 引用
2007-08-20 17:55 by wmzlly[未注册用户]
你好,我按照你上边的方法试了试,打出来的信息里有乱码。
源文件里只有文字。不包含其他特殊的东西。
不知道是那里的问题。请教楼主有没有遇到类似的问题。
该怎么解决。谢谢~~
#18楼
回复 引用
2008-02-01 15:00 by xijuju[未注册用户]
读取出来的不自动换行,格式很乱,怎么办呀?大哥
#19楼
回复 引用 查看
2010-02-10 09:50 by shappy

谢谢,讲解的相当详细,不过很多回复问题的人感觉都在用屁股写程序,那么简单的问题怎么不自己试一下再问呢,关于后面有空格
stringbuffer sb = new stringbuffer();
int len;
while ((len = reader.read()) != -1) {
sb.append((char) len);
}
system.out.println(sb.tostring());
如果怕文字太长,而且只取中间部分可以用bufferedreader.readline。还有问自动换行的,自己找块豆腐撞死算了。
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页
首页博问闪存新闻园子招聘知识库
最新it新闻:
·12位技术领袖的新年决心(10)telsa motors和spacex的ceo elon musk– 再一次引爆电动汽车市场
·windows 8可能动摇wintel长达30年的商业联盟
·pc 厂商的逆袭:联想和宏碁的 ces 展品
·品聚网今日公告:资金链断裂 1月9日暂停业务
·中兴:员工月薪万元仍感深圳生活困难
»
更多新闻...
最新知识库文章:
·持续集成之“everything is code”
·持续集成之“软件自我识别”
·持续集成之戏说check-in dance
·什么是闭包。

我的理解
·什么是闭包(closure)?
»
更多知识库文章...



china-pub 2011秋季教材巡展
china-pub 计算机绝版图书按需印刷服务

======================================================

在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定
这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: