第三者插足——Lucene的新欢xpdf

    技术2024-07-20  78

    public static void main(String[] args) { try { XpdfTest xpdf = new XpdfTest("E://Core Java.pdf"); xpdf.setCONVERTOR_STORE_PATH("E://开发学习资料/搜索引擎Lucene/lucene关于/xpdfTest/xpdf-3.02pl4-win32"); xpdf.toTextFile("E://test.txt"); //输出命令语句,检查命令是否正确 String[] s = xpdf.getCmd(new File("E://test.txt"), true); for(int i=0;i<xpdf.getCmd(new File("E://test.txt"), true).length;i++){ System.out.print(s[i]); } } catch (IOException e) { e.printStackTrace(); }         有一天LucenePDFBox之间多了一位,这便是xpdfPDFBox女士责骂Lucene先生说:“我的API功能如此强大,甚至能和你进行无缝结合,你为什么还要去找别的女人?”可是Lucene先生说:“你是知道的,I love China,可是你偏偏不支持中文文本的提取……”于是乎,Lucene先生就跟xpdf女士好上了。

     

           好了,以上就是xpdf相对于PDFBox的优势了。那么Lucene仅凭借这一原因就抛弃了PDFBox了吗?不,当然不是。每一种技术在它独有的领域里面发挥着它最大的能量,PDFBox对于Lucene而言,当然还有其他可用之处的。况且每一种技术都更新的很快,现在的PDFBox想必已经更新很多次,增加了很多功能了吧。

     

           xpdfpdf文件的txt格式转化,较PDFBox来说,简单了很多。(注意:用起来越简单的东西,对它底层所做的操作就越复杂,这些简单都是前辈们用汗水换来的)我们可以在官网上下载xpdf的所有jar包和程序。

           官网下载:http://www.foolabs.com/xpdf/download.html

           下载内容: xpdf-3.02pl4-win32(我用的是这个版本)xpsf-chinese-simplified.tar.gz

     

           下载完毕之后,我们将xpdf-3.02pl4-win32解压后发现有一个叫做pdftotext.exe的应用程序,这个就是xpdfpdf转化为txt的工具了。做一个小小的示范:将自己的pdf文件放到和pdftotext.exe文件所在的同一目录下;然后打开Windows命令行并进入到该目录下;最后只要在命令行里输入这样的一句话就大功告成了pdftotxt  test.pdf  test.txt(其中,test.pdf是要转化的pdf文件,test.txt是给转化后txt文件命名)。或者,直接将test.pdf拖入到pdftotxt.exe文件中,即可直接转化成txt文件了。

     

           通过以上的操作,我们不难发现,xpdf是简单了不少吧。但是,上一会我们也提到,要将pdf转化为txt,并不是看起来那么简单的事情,比如转化后时候保持原来文件的布局,编码方式又如何设置,时候打印提示消息,页面之间是否加入分页,如果不保持原来的布局又该怎么设置等等一系列的pdf属性,都需要我们来处理。所以,我们在此写一个类,将这些属性设置进行封装,最后让其返回一个命令行命令的字符串,直接调用Windows命令行就OK了。

     

     

    (代码如下)

    public class XpdfTest { //PDF文件名 private File pdfFile; //转换器的存放位置 private String CONVERTOR_STORED_PATH = "E://开发学习资料/搜索引擎Lucene/lucene关于/xpdfTest/xpdf-3.02pl4-win32"; //转换器的名称 private String CONVERTOR_NAME = "pdftotext"; //构造函数,参数为PDF的路径 public XpdfTest(String pdfFile)throws IOException{ this(new File(pdfFile)); } //构造函数,参数为PDF文件的对象 public XpdfTest(File pdfFile)throws IOException { this.pdfFile = pdfFile; } //将PDF转化为文本文档 public void toTextFile(String targetFile)throws IOException{ toTextFile(new File(targetFile),true); } //将PDF转化为文本文档 public void toTextFile(File targetFile, boolean isLayout)throws IOException { String[] cmd = getCmd(targetFile,isLayout); Process p = Runtime.getRuntime().exec(cmd); } //获取PDF转换器的路径 public void setCONVERTOR_STORE_PATH(String path){ if(!path.trim().endsWith("//")){ path = path.trim() + "//"; } this.CONVERTOR_STORED_PATH = path; } //解析命令行参数 public String[] getCmd(File targetFile,boolean isLayout){ //命令字符 String command = CONVERTOR_STORED_PATH + " " + CONVERTOR_NAME; //PDF文件的绝对路径 String source_absolutePath = " " +pdfFile.getAbsolutePath(); //输出文本文件的绝对路径 String target_absolutePath = " " + targetFile.getAbsolutePath(); //保持原来的布局 String layout = " -layout"; //设置编码方式 String encoding = " -enc"; String character = " GBK"; //设置不打印任何消息和错误 String mistake = " -q"; //页面间不加入分页 String nopagebrk = " -nopgbrk"; //如果islayout为false,则设置不保持原来的layout if(!isLayout){ layout = ""; } return new String[] {command, layout, encoding, character, mistake, nopagebrk, source_absolutePath, target_absolutePath}; } }   

    这就是对xpdfpdf文件的的属性的封装了,这里只列举了部分属性,还有其他属性和用法可以在xpdf的官网上学习。

    最后,我们在写一个测试类进行测试,这里也可以说是客户端了。

    (代码如下)

    最新回复(0)