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

[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^)/

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

  1. python读取pdf文档书签 bookmark_Python利用PyPDF2库获取PDF文件总页码实例

    Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...

  2. python读取扫描形成的pdf_Python利用PyPDF2库获取PDF文件总页码实例

    Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...

  3. Python利用PyPDF2库获取PDF文件总页码

    Python中可以利用PyPDF2库来获取该pdf文件的总页码,可以根据下面的方法一步步进行下去: 1.首先,要安装PyPDF2库,利用以下命令即可: pip install PyPDF2 2.接着, ...

  4. java从远程服务器获取PDF文件并后台打印(使用pdfFox)

    一.java原生方式打印PDF文件 正反面都打印,还未研究出只打印单面的方法,待解决 public static void printFile(String path) throws Exceptio ...

  5. 使用PyPDF2库对pdf文件进行指定页面删除操作

    平台:win10家庭版,python 3.7,PyPDF2 思维过程: 方法一:将pdf文件通过拆分为单页,放入一个文件夹,再删除其中不要的文件,最后再把剩余的文件进行合并为一个pdf文件 第一步:使 ...

  6. Python批量处理csv文件转Excel--xlsx文件——利用pandas库(csv文件可指定分隔符)

    最近工作需要处理大量csv文件转换成.xlsx进行数据处理,手动转换效率低,于是上网查了很多批量转csv教程,可惜的是所有教程几乎都是默认csv分隔符为逗号,很不幸的是我的csv文件是分号  &quo ...

  7. java获取Pdf文件页码

    java获取Pdf文件页码步骤如下: 引入依赖: <dependency><groupId>org.apache.pdfbox</groupId><artif ...

  8. java 获取pdf总页数_如何获取PDF文件的总页数 - iTextSharp,c#

    我需要帮助.我花了最后4个小时试图获得我的PDF文件的总页数.我希望在页脚中有"Page X/Y"之类的内容.有人可以告诉我该怎么做这个代码?如何获取PDF文件的总页数 - iTe ...

  9. 使用iText库创建PDF文件

    前言 译文连接:http://howtodoinjava.com/apache-commons/create-pdf-files-in-java-itext-tutorial/ 对于excel文件的读 ...

  10. java在linux生成pdf文件,从 Java 应用程序动态生成 PDF 文件

    简介: 如果您的应用程序需要动态生成 PDF 文档,那么您需要 iText 库.开源的 iText 库使得 PDF 的创建变得轻松易行.本文介绍了 iText 并提供了一个使用它从 Java 技术应用 ...

最新文章

  1. Codeforces Round #308 (Div. 2) C. Vanya and Scales dfs
  2. OpenVINO + OpenCV实现点头与摇头识别验证
  3. [Manifest]关于sharedUserIdsharedUserLabel
  4. 关于java的volatile
  5. Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed
  6. 扩展Java EE应用程序的基础
  7. mysql中的内置函数
  8. VS2013在Release情况下使用vector有时候会崩溃的一个可能原因
  9. MVC 使用Jquery实现AJax
  10. 8款惊艳的HTML5粒子动画特效
  11. 阿里云混合云新一代运维平台的演进与实践
  12. windows10提权
  13. 数学建模:排队论模型
  14. 计算机按姓氏笔画顺序排序规则,【姓氏文化】按姓氏笔画排序的原则
  15. 【科研绘图】沐风老师3DMAX极小曲面建模教程
  16. “茴”字有四种写法,广发有三种分期;你都知道吗?
  17. 如何用计算机绘函数图,用计算机绘制函数图像.
  18. 面试被问TypeScript,我哑口无言
  19. 微信小程序直播二三事
  20. 基于springboot的文件上传功能的实现

热门文章

  1. 路由器不开机——维修更换MT7621AT CPU
  2. [渝粤教育] 西南科技大学 液压与气压传动 在线考试复习资料(1)
  3. C-LODOP打印插件使用
  4. 英雄联盟 League of Legends for Mac(LOL美服)
  5. 饿了么移动APP的架构演进
  6. dirent.h缺失,Microsoft Visual Studio 2019( Professional)解决方案
  7. winrar去弹窗广告激活办法!!
  8. 数据结构 Hash表(哈希表)
  9. vb2008 获取u盘id_【干货】纯 windows 系统绕苹果ID解锁,傻瓜式的教程
  10. 【嵌入式技术】Atmega128串口详解