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

简介:

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

编写者

日期

关键词

郑昀@ultrapower

2005-8-2

Java PDF xpdf

 

概述

读取PDF文件的某一部分文本内容,可以使用开源项目xpdf

Java中调用xpdf,我们参照了《Java抽取WordPDF的四种武器》文章最后提到的办法。

总而言之,调用xpdf十分简单,下面讲一下xpdf的配置问题。

系统基础环境要求

下面是对运行xpdf软件服务的计算机的要求:

l         您可以从以下位置下载并安装 xpdf分发版本-补丁3Win32版本:
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解压缩到Cxpdf目录下,我们将以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)

cidToUnicode     Adobe-GB1  C:/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode

unicodeMap ISO-2022-CN     C:/PublicInstall/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap

unicodeMap EUC-CN       C:/xpdf/chinese-simplified/EUC-CN.unicodeMap

unicodeMap GBK      C:/xpdf/chinese-simplified/GBK.unicodeMap

cMapDir      Adobe-GB1  C:/xpdf/chinese-simplified/CMap

toUnicodeDir                 C:/xpdf/chinese-simplified/CMap

#displayCIDFontTT   Adobe-GB1  /usr/..../gkai00mp.ttf

#----- end Chinese Simplified support package

注意Map文件的路径一定要正确。

 

修改配置文件二:

另外,配置文件中原先没有加上一个“textPageBreaks”控制。为了避免这个分页符号,我们需要在xpdfrc文件“text output control”下面加上这么一段话:

多加这么一段配置:

# If set to "yes", text extraction will  insert  page

# breaks  (form feed characters) between pages.  This

# defaults to "yes".

textPageBreaks      no

 

设置textPageBreaksno的意思是:在PDF文档的两页之间不加入分页符号。

之所以这样,是因为这个符号有时候会引起SAX解析XML上的困难。

 

修改配置文件三:

配置文件中原先把textEncoding注释了。这样默认的字符集是Latin1。我们必须打开它,并且就是指定textEncodingUTF-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

 

目录
相关文章
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
75 9
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
20天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
81 34
|
1月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
43 3
|
1月前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
4天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
6天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。
|
6天前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。
|
6天前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
22 3
|
6天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
69 2