`

lucene如何解析pdf文档

阅读更多
XPDF使用文档
XPDF版本 3.0.2
日期 2008-11-26
文档版本 V1.0

1、概述
读取PDF文件中的文本内容,可以使用开源项目xpdf。下载地址:http://www.foolabs.com/xpdf/download.html。
注意使用:xpdf-3.02pl2-win32.zip以及xpdf-chinese-simplified.tar.gz(支持中文)。

2、安装
将xpdf-3.02pl2-win32.zip解压缩到D盘xpdf目录下,我们将以d:\xpdf作为xpdf的工作路径。
将xpdf-chinese-simplified.tar解压缩到xpdf根目录下的xpdf-chinese-simplified目录中。
为了启用中文简体语言包,您必须将xpdf目录下的sample-xpdfrc文件另存为xpdfrc文件。
注意:此文件为配置文件,而且名称必须是xpdfrc。如果是别的名字,即使调用pdftotext.exe时,传入”-cfg xpdfrc2”来告诉xpdf配置文件的名字,好像pdftotext.exe也并没有使用这个配置文件。所以为了减少误解,请您将配置文件直接命名为xpdfrc。
并在这个xpdfrc文件最后加上以下配置,注意Map文件的路径一定要正确。

#----- begin Chinese Simplified support package (2004-jul-27)
cidToUnicode     Adobe-GB1  D:/xpdf/ xpdf-chinese-simplified/Adobe-GB1.cidToUnicode
unicodeMap ISO-2022-CN     D:/xpdf/ xpdf-chinese-simplified/ISO-2022-CN.unicodeMap
unicodeMap EUC-CN       D:/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap
unicodeMap GBK      D:/xpdf/xpdf-chinese-simplified/GBK.unicodeMap
cMapDir      Adobe-GB1  D:/xpdf/xpdf-chinese-simplified/Cmap
toUnicodeDir                 D:/xpdf/xpdf-chinese-simplified/Cmap
#displayCIDFontTT   Adobe-GB1  /usr/..../gkai00mp.ttf
#----- end Chinese Simplified support package
另外,配置文件中原先没有加上一个“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

设置textPageBreaks为no的意思是:在PDF文档的两页之间不加入分页符号。之所以这样,是因为这个符号有时候会引起SAX解析XML上的困难。
配置文件中原先把textEncoding注释了。这样默认的字符集是Latin1。我们必须打开它
#textEncoding		UTF-8
textEncoding		GBK

3、命令行调用
D:\xpdf\xpdf-3.02pl2-win32>pdftotext.exe -cfg xpdfrc d:\dwr中文文档(pdf).pdf

4、JAVA调用示范
pdftotext.exe的运行参数中,

private String excuteStr = "D:\\xpdf\\xpdf-3.02pl2-win32\\pdftotext.exe";
	
public String getContent()  {		
		String[] cmd = new String[] { excuteStr, "-enc", "UTF-8", "-q", file.getAbsolutePath(),"-" };

		Process p = null;
		BufferedInputStream bis = null ;
		InputStreamReader reader = null;
		StringBuffer sb = null;
		BufferedReader br = null;
		
		try {
			p = Runtime.getRuntime().exec(cmd);
			bis = new BufferedInputStream(p.getInputStream());
			reader = new InputStreamReader(bis, "UTF-8");
			
			sb = new StringBuffer();
			br = new BufferedReader(reader);
			String line = br.readLine();
			sb = new StringBuffer();
			while (line != null) {
				System.out.println(line);
				sb.append(line);
				sb.append(" ");
				line = br.readLine();
			}

		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close() ;
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		content = sb.toString() ;
		
 		return content ;
	}

一个应用的demo
package com.cs;

public interface Parsable {
	
	public String getTitle() ;
	public String getContent()  ;
	public String getSummary()  ;
}

package com.cs;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;

public class PdfParser implements Parsable {
	private File file ;
	private String content ;//内容
	
	/*
	 * pdf解读需配置
	 */
	private String executeStr = "E:\\EclipseStudyWorkspace\\LuceneParse\\xpdf\\xpdf-3.02pl2-win32\\pdftotext.exe" ;
	
	public PdfParser(File file){
		this.file = file ;
	}
	
	public String getContent(){
		
		if (content != null){
			return content ;
		}
		
		String[] cmd = new String[]{executeStr,"-enc","UTF-8","-q",file.getAbsolutePath(),"-"} ;
		Process p = null ;
	 
	 
		BufferedReader br = null ;
		StringBuffer sb = new StringBuffer() ;
		try {
			p = Runtime.getRuntime().exec(cmd) ;
			
			br = new BufferedReader(new InputStreamReader(p.getInputStream(),"UTF-8")) ;
			
			String str = null ;
			while((str = br.readLine() ) != null ){
				sb.append(str).append("\n") ;
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally{
			if (br != null){
				try {
					br.close() ;
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		content = sb.toString() ;
		
		return content ;
	}
	
	public String getSummary() {
		String summary ;
		if (content == null ) {
			getContent() ;
		}
		
		if (content.length() > 200) {
			summary = content.substring(0, 200) ;
		}else {
			summary = content ;
		}
		
		return summary;
	}
	
	public String getTitle(){
		return file.getName() ;
	}
	
	public static void main(String[] args){
		PdfParser parser = new PdfParser(new File("E:\\EclipseStudyWorkspace\\LuceneParse\\fileSource\\123.pdf")) ;
		System.out.println("pdf content : "+parser.getContent()) ;
	}
}


项目的结构
-projectName
------------src
------------webroot
------------xpdf
            ----xpdf-3.02pl2-win32
            ----xpdf-chinese-simplified
分享到:
评论
1 楼 carlwu 2014-05-06  
谢谢,文章写得非常清晰!

相关推荐

    毕设 Lucene解析索引PDF文档的内容

    iTextPDFExtractor.java ------ ...--PDFBox创建PDF文件的Lucene索引 PDFBoxPathIndex.java ------- --PDFBox创建指定目录PDF文档索引 POIOfficeExtractor.java ----- -- POI处理Excel和Word文档代码

    lucene 搜索中文PDF文档

    **正文** ...总结,利用Lucene搜索中文PDF文档涉及多个技术层面,包括中文分词、PDF解析、索引构建、搜索执行和性能优化。通过理解这些关键技术,开发者可以构建出高效、准确的中文PDF文档检索系统。

    lucene学习pdf2

    "lucene学习pdf2" 提供的文档,无疑是对Lucene深入理解的一把钥匙,它涵盖了Lucene的核心概念、操作流程以及高级特性。 首先,Lucene的基础知识是必不可少的。Lucene的核心在于索引和搜索,它将非结构化的文本数据...

    Lucene应用中Pdf文档文本数据提取方法研究

    这一步骤是将二进制的Pdf文档转换成可供Lucene分析和索引的文本格式的关键。 3. **将提取的文本整合到Lucene索引**: 一旦文本数据被提取,接下来就是将这些文本信息整合到Lucene的Document对象中,以便进行后续的...

    基于Lucene的PDF文档的全文检索的实现

    在索引过程中,先将PDF文档转换的TXT文本解析成Lucene文档和域,再通过IndexWriter的addDocument方法添加到索引中。 当索引建立完成后,就可以进行搜索操作。搜索过程主要由IndexSearcher类完成,它负责打开索引并...

    lucene原理分析pdf

    Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎...

    使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现 - 干勾鱼的CSDN博客 - CSDN博客1

    而对于PDF文件,Apache PDFBox库被用于解析PDF文档,`PDFParser` 和 `PDFTextStripper` 类组合在一起可以从PDF中抽取文本。 以下是一般的步骤来实现全文检索功能: 1. **初始化**: 创建 `Directory` 对象和 `...

    Lucene的原理完整版pdf

    查询语句通过`QueryParser`解析成`Query`对象,然后`IndexSearcher`会找到与查询匹配的文档。 3. **评分(Scoring)**:Lucene使用TF-IDF算法来评估文档与查询的相关性,给出一个评分。评分高的文档在搜索结果中...

    Lucene.Net 文件检索doc,xls,ppt,txt,pdf文件(实例)

    通过以上步骤,我们可以构建一个功能强大的文件检索系统,支持多种文件类型,满足用户对doc、xls、ppt、txt和pdf文件的快速查找需求。在实际项目中,可以根据具体需求进行调整和扩展,如增加对其他文件类型的处理、...

    Lucene3.0_pdf

    《Lucene3.0原理与代码分析》是针对搜索引擎库Lucene 3.0版本的一份详尽解析,旨在帮助读者深入理解其内部工作机制和实现细节。Lucene是一款高性能、全文检索库,广泛应用于各类信息检索系统。下面将围绕Lucene的...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    2. **Lucene API**:详细讲解了Lucene的各个核心组件,如Analyzer(分析器)用于处理文本,Document(文档)用于存储数据,IndexWriter(索引写入器)用于创建和更新索引,以及Searcher(搜索器)用于执行查询。...

    开放源代码的全文检索引擎_Lucene参考.pdf

    5. **社区支持**:作为开源项目,Lucene拥有庞大的开发者社区,不断推动着其功能完善和错误修复,提供了丰富的文档和示例,方便学习和使用。 通过这些特性,Lucene成为了构建全文检索系统的理想选择,无论是小型...

    lucene相关文档pdf

    LuceneInAction(第2版)_中文版.pdf。 Lucene是apache下的一个开放源代码的全文检索引擎工具包。提供了完整的查询引擎和索引引擎,部分文本分析引擎。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便...

    开放源代码的全文检索引擎Lucene终稿.pdf

    《开放源代码的全文检索引擎Lucene终稿》是一份深度解析开源全文检索引擎Lucene的文档,旨在介绍Lucene的基本概念、系统架构以及源码实现。全文主要分为四个部分,详细阐述了Lucene的核心技术和应用。 在第一部分,...

    lucene 3.6 检索文件 pdf word ppt excel txt html xml

    例如,对于PDF和Word文档,它使用内置的解析器提取文本内容;对于HTML和XML文件,它能识别并提取出有意义的部分进行索引。对于Excel和PPT,虽然它们主要是结构化数据,但Lucene也能通过解析内容提取文本信息。 除了...

    Lucene技术文档doc

    1. **索引创建**:Lucene能够高效地读取各种文件格式(如HTML、PDF、DOC等),提取文本并建立索引。索引过程包括分词、去除停用词、词干化等预处理步骤,以优化搜索性能。 2. **查询处理**:Lucene支持多种查询语法...

Global site tag (gtag.js) - Google Analytics