文件操作.docx

上传人:b****1 文档编号:20110016 上传时间:2023-04-25 格式:DOCX 页数:46 大小:867.63KB
下载 相关 举报
文件操作.docx_第1页
第1页 / 共46页
文件操作.docx_第2页
第2页 / 共46页
文件操作.docx_第3页
第3页 / 共46页
文件操作.docx_第4页
第4页 / 共46页
文件操作.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

文件操作.docx

《文件操作.docx》由会员分享,可在线阅读,更多相关《文件操作.docx(46页珍藏版)》请在冰豆网上搜索。

文件操作.docx

文件操作

2010-08-20

缩略显示

[置顶]用xpdf和pdfbox来处理中文PDF文档及其比较

文章分类:

Java编程

TestPdfToText.java我在以前的项目中使用的是pdfbox,在读取中文文档时可以读出大部分的文字,但是在数字、分页等地方还是不可避免的出现乱码。

于是我在网上搜索,看有没有什么解决方法,看到有说法:

“PDFBox看起来非常的方便,它的API功能强大。

甚至能和Lucene进行无缝的结合。

但是它有一个致命的弱点,就是它不支持中文。

要提取中文的文本,可以采用另一个非常出色的工具xpdf。

于是我决定自己比较一下这两种方法处理中文pdf文档时在时间性能、读取效果等各个方面的效果。

 

一、关于XPDF和PDFBOX

1.xpdf

xpdf只是一个软件,通过java采用命令行调用,并获取输出结果,如此来说使用简单,但是相当受限,如:

无法跨平台,无法处理特定格式(表格等),无法处理图片和其他附件。

这种调用必定限制了它的灵活性。

2.pdfbox

pdfbox(一个BSD许可下的源码开放项目)是一个为开发人员读取和创建PDF文档而准备的纯Java类库。

 

二、XPDF的配置

1.工具包下载

点这里 下载

我下载的是:

 xpdf-3.02pl4-win32.zip

另外还需要一个语言包:

 xpdf-chinese-simplified.tar.gz

2.工作路径设置

参考资料点这里

在本文中以c:

\xpdftest\xpdf作为xpdf的工作路径。

将xpdf-3.02p14-win32.zip解压到c:

\xpdftest\xpdf下。

将xpdf-chinese-simplified.tar.gz解压到c:

\xpdftest\xpdf\xpdf-chinese-simplified下。

解压后的目录结构如图1所示:

3.修改配置文件

为了启用中文简体语言包,必须将 xpdf-chinese-simplified 目录下的 sample-xpdfrc 文件进行如下配置,并将其另存为xpdfrc 文件 。

注意:

此文件为配置文件,而且名称必须是 xpdfrc 。

如果是别的名字,即使调用 pdftotext.exe 时,传入 ” -cfgxpdfrc2 ” 来告诉 xpdf 配置文件的名字,好像 pdftotext.exe 也并没有使用这个配置文件。

所以为了减少误解,请您将配置文件直接命名为xpdfrc 。

∙修改 sample-xpdfrc 文件之一

在文件后面 加上一段话 :

#-----beginChineseSimplifiedsupportpackage(2004-jul-27)

cidToUnicodeAdobe-GB1C:

/xpdftest/xpdf/xpdf-chinese-simplified/Adobe-GB1.cidToUnicode

unicodeMapISO-2022-CNC:

/xpdftest/xpdf/xpdf-chinese-simplified/ISO-2022-CN.unicodeMap

unicodeMapEUC-CNC:

/xpdftest/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap

unicodeMapGBKC:

/xpdftest/xpdf/xpdf-chinese-simplified/GBK.unicodeMap

cMapDirAdobe-GB1C:

/xpdftest/xpdf/xpdf-chinese-simplified/CMap

toUnicodeDirC:

/xpdf/chinese-simplified/CMap

#displayCIDFontTTAdobe-GB1/usr/..../gkai00mp.ttf

#-----endChineseSimplifiedsupportpackage

 

注意:

路径要跟自己配置的一样。

∙修改 sample-xpdfrc 文件之二

另外,配置文件中原先没有加上一个“ textPageBreaks ”控制。

为了避免这个分页符号,我们需要在 sample-xpdfrc 文件 “ textoutputcontrol ”下面 加上一段话 :

#Ifsetto"yes",textextractionwillinsertpage

#breaks(formfeedcharacters)betweenpages.This

#defaultsto"yes".

textPageBreaksno

 

设置 textPageBreaks 为 no 的意思是:

在 PDF 文档的两页之间不加入分页符号。

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

 

 

∙修改 sample-xpdfrc 文件之三

配置文件中原先把 textEncoding 注释了。

这样默认的字符集是 Latin1 。

我们必须打开它,并且就是指定 textEncoding 为UTF-8 ,而不是 GB2312 。

即修改这句话 :

textEncodingUTF-8

 

三、PDFBOX的配置

请点这里 查看PDFBOX的配置。

 

四、工程调用示范

在自己的常用工作环境下新建一个工程PdfTest,并在此工程下新建一个包pdfToText。

此包包括三个类:

TestPdfToText.java 包括Main函数,调用并测试xpdf和pdfbox对PDF文档的处理效果。

PdfboxToText.java  用pdfbox来处理PDF文档。

XpdfToText.java      用xpdf来处理PDF文档。

目录结构如图2所示:

在C盘根目录下有061231.pdf,在工程中相应设置路径进行测试,以下是源代码 :

TestPdfToText.java

packagepdfToText;

/**

*功能描述:

测试用XPDF和PDFBOX来读取中文PDF文件生成TXT文件的效果

*@authorEmily

*@Create2010-03-07

*/

publicclassTestPdfToText{

/**

*@paramargs

*/

publicstaticvoidmain(String[]args){

StringrootPath="c:

\\061231";

//pdf文件路径

Stringpdffile=rootPath+".pdf";

//用xpdf生成的txt文件路径

StringxpdfToTxtfile=rootPath+"_xpdf.txt";

//用pdfbox生成的txt文件路径

StringpdfboxToTxtfile=rootPath+"_pdfbox.txt";

//XPDF

try{

longbegin=System.currentTimeMillis();

XpdfToTextxpToTxt=newXpdfToText(pdffile);

xpToTxt.toTextFile(xpdfToTxtfile);

longend=System.currentTimeMillis();

System.out.println("xpdf\tcost:

\t"+(end-begin)+"ms");

}catch(Exceptione){

e.printStackTrace();

}

//PDFBOX

try{

longbegin=System.currentTimeMillis();

PdfboxToTextpbToTxt=newPdfboxToText(pdffile);

pbToTxt.toTextFile(pdfboxToTxtfile);

longend=System.currentTimeMillis();

System.out.println("pdfbox\tcost:

\t"+(end-begin)+"ms");

}catch(Exceptione){

e.printStackTrace();

}

}

}

PdfboxToText.java

 

packagepdfToText;

importjava.io.BufferedWriter;

importjava.io.File;

importjava.io.FileInputStream;

importjava.io.FileNotFoundException;

importjava.io.FileWriter;

importjava.io.IOException;

importorg.pdfbox.pdfparser.PDFParser;

importorg.pdfbox.pdmodel.PDDocument;

importorg.pdfbox.util.PDFTextStripper;

publicclassPdfboxToText{

privateStringfilePath;

publicPdfboxToText(StringfilePath){

this.filePath=filePath;

}

publicStringgetTextFromPdf(){

Stringresult=null;

FileInputStreamis=null;

PDDocumentdocument=null;

try{

is=newFileInputStream(filePath);

PDFParserparser=newPDFParser(is);

parser.parse();

document=parser.getPDDocument();

PDFTextStripperstripper=newPDFTextStripper();

result=stripper.getText(document);

}catch(FileNotFoundExceptione){

e.printStackTrace();

}catch(IOExceptione){

e.printStackTrace();

}finally{

if(is!

=null){

try{is.close();}catch(IOExceptione){e.printStackTrace();}

}

if(document!

=null){

try{document.close();}catch(IOExceptione){e.printStackTrace();}

}

}

returnresult;

}

publicvoidtoTextFile(StringfilePath){

StringpdfContent=getTextFromPdf();

try{

Filef=newFile(filePath);

if(!

f.exists()){

System.out.println("notexist");

f.createNewFile();

}

BufferedWriteroutput=newBufferedWriter(newFileWriter(f));

output.write(pdfContent);

output.close();

}catch(Exceptione){

e.printStackTrace();

}

}

}

 

XpdfToText.java

packagepdfToText;

importjava.io.File;

importjava.io.IOException;

publicclassXpdfToText{

//PDF文件名

privateFilepdffile;

//转换器的存放位置,默认在c:

\xpdftest\xpdf下面

privateStringCONVERTOR_STORED_PATH="c:

\\xpdftest\\xpdf\\";

//转换器的名称,默认为pdftotext

privateStringCONVERTOR_NAME="pdftotext";

//构造函数,参数为pdf文件的路径

publicXpdfToText(Stringpdffile)throwsIOException{

this.pdffile=newFile(pdffile);

}

//将pdf转为文本文档,参数为目标文件的路径

publicvoidtoTextFile(Stringtargetfile)throwsIOException{

toTextFile(targetfile,true);

}

//将pdf转为文本文档,参数1为目标文件的路径,

//参数2为true则表示使用PDF文件中的布局

publicvoidtoTextFile(Stringtargetfile,booleanisLayout)

throwsIOException{

String[]cmd=getCmd(newFile(targetfile),isLayout);

Runtime.getRuntime().exec(cmd);

}

//获取PDF转换器的路径

publicStringgetCONVERTOR_STORED_PATH(){

returnCONVERTOR_STORED_PATH;

}

//设置PDF转换器的路径

publicvoidsetCONVERTOR_STORED_PATH(Stringpath){

if(!

path.trim().endsWith("\\"))

path=path.trim()+"\\";

this.CONVERTOR_STORED_PATH=path;

}

//解析命令行参数

privateString[]getCmd(Filetargetfile,booleanisLayout){

//命令字符

Stringcommand=CONVERTOR_STORED_PATH+CONVERTOR_NAME;

//PDF文件的绝对路径

Stringsource_absolutePath=pdffile.getAbsolutePath();

//输出文本文件的绝对路径

Stringtarget_absolutePath=targetfile.getAbsolutePath();

//保持原来的layout

Stringlayout="-layout";

//设置编码方式

Stringencoding="-enc";

Stringcharacter="GBK";

//设置不打印任何消息和错误

Stringmistake="-q";

//页面之间不加入分页

Stringnopagebrk="-nopgbrk";

//如果isLayout为false,则设置不保持原来的layout

if(!

isLayout)

layout="";

returnnewString[]{command,layout,encoding,character,mistake,

nopagebrk,source_absolutePath,target_absolutePath};

}

}

 

五、测试结果和总结

1.txt文件大小

一个大小为74KB的PDF文档经处理为txt文档后,大小明显减小。

经xpdf处理后生成了10KB的txt文件。

经pdfbox处理后生成了12KB的txt文件。

 

2.时间性能

从运行结果来看,xpdf处理的速度明显大大快于pdfbox的处理速度,几乎是1/10。

如图3所示。

 

3.读取效果

在设置了保持原PDF文档的布局的情况下,xpdf读取的效果如图4所示

 若不保持原PDF文的的布局,xpdf读取的效果如图5所示

经pdfbox读取的效果如图6和图7所示。

 

 4.分析总结

从以上调用结果可以发现,在时间性能和空间性能上,xpdf都明显优于pdfbox 。

在最关键的读取效果上,pdfbox会自动在某些读取文字中加入一些格式,比如回车、空格等,造成了更不好的效果。

至于在某些PDF文档的格式会读出乱码的情况上,两种方法读出的乱码都是比较一致的,这应该是由于这两个方法的缺陷造成的。

综上所示,如果不要求很高的移植性的话,采用xpdf应该是比较好的方法 。

 

(完)

create@2010-03-08

∙查看图片附件

∙17:

58

∙浏览(242)

∙评论 (0)

∙分类:

 Java编程

∙收藏

2010-08-20

缩略显示

使用ictclas4j过程中产生的内存不足问题及其解决方法

文章分类:

Java编程

在读取中文pdf文档的内容并对用ictclas4j对其进行分词过程中,在读取pdf这一步上面没有问题(即没有报错,可以正确运行,但是会出现一些乱码,这可能是由于pdfbox包的不够完善,可以通过用xpdf来读取进行一定的改善。

但是到了分词这一步上面有时候会报错:

Exceptioninthread"main"java.lang.OutOfMemoryError:

Javaheapspace

atjava.util.Arrays.copyOf(UnknownSource)

atjava.lang.AbstractStringBuilder.expandCapacity(UnknownSource)

atjava.lang.AbstractStringBuilder.append(UnknownSource)

atjava.lang.StringBuilder.append(UnknownSource)

atorg.ictclas4j.segment.SegTag.split(SegTag.java:

125)

atemily.function.TextExtraction.classifyWord(TextExtraction.java:

43)

atemily.function.TextExtraction.getExtractText(TextExtraction.java:

26)

atemily.function.BuildXMLDocument.builder(BuildXMLDocument.java:

60)

atemily.function.Main.main(Main.java:

16)

解决:

 

在run->openrundialog->(x)=argument

新设置参数 -Xmx800m

 

(完)

create@2010-01-28

∙查看图片附件

∙17:

42

∙浏览(31)

∙评论 (0)

∙分类:

 Java编程

∙收藏

2010-08-20

缩略显示

JAVA的JDK环境变量设置

文章分类:

Java编程

1.安装jdk1.6.0:

    执行j2sdk安装程序,自定义路径,我们的安装路径为:

C:

\ProgramFiles\Java\jdk1.6.0

2. 配置jdk1.6.0

我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量:

JAVA_HOME=C:

\ProgramFiles\Java\jdk1.6.0

CLASSPATH=.;C:

\ProgramFiles\Java\jdk1.6.0\lib\tools.jar;

C:

\ProgramFiles\Java\jdk1.6.0\lib\dt.jar;C:

\ProgramFiles\Java\jdk1.6.0\bin;

PATH=C:

\ProgramFiles\Java\jdk1.6.0\bin;

 或是:

JAVA_HOME=C:

\ProgramFiles\Java\jdk1.6.0

CLASSPATH=.;%JAVA_HOME%\lib\tools.jar;

%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\bin;

PATH=%JAVA_HOME%\bin;

 

3.编写测试程序HelloWorld.java

写一个简单的java程序来测试JDK是否已安装成功:

publicclassHelloWorld

{

publicstaticvoidmain(Stringargs[])

{

System.out.println("HelloWorld");

}

   将程序保存为文件名为HelloWorld.java的文件。

    注意系统文件夹选项中应确定“隐藏已知文件类型的扩展名”不勾选(我的电脑->工具->查看)

 

4. 测试是否安装成功

打开命令提示符窗口,进入到 HelloWorld.java 所在目录,键入下面的命令:

javachello.java

javahello

1.

此时若打印出来 HelloWorld 则安装成功。

若没有打印出这句话,仔细检查以上配置是否正确。

(完)

create@2009-12-01

∙查看图片附件

∙17:

22

∙浏览(53)

∙评论 (0)

∙分类:

 Java编程

∙收藏

2010-08-20

缩略显示

在Eclipse下将工程打包成jar格式

文章分类:

Java编程

一、情况说明

前段时间自己写了一个工程DocumentToXML,功能是把文件进行一系列信息的提取(文本内容,文件创建时间等),然后生成对应的XML文档。

由于需要提交给组里面的其他人使用,因此要求便于移植。

之前没有经历过要跟别人合作的,都是自己写了一个工程能够运行就好了,因此还颇费了一番功夫,看看怎么生成jar给别人调用。

 

二、查阅资料

  这里有一些对jar的说明情况。

1. JAR文件揭密

2. Eclipse项目的打包发行-good

3. myEclipse下项目打包

 

三、打包过程

在Eclipse里面提供了用于打包项目的 “导出”向导,但是在之前,先需要创建一个文件:

manif

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1