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


======================================================
注:本文源代码点此下载
======================================================

[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^)/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值