生活随笔
收集整理的這篇文章主要介紹了
XPdf实现pdf转txt格式方法实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
近期在弄一個項目,需要將pdf文檔的每一個段落關(guān)鍵字提取出來。很直接的想法就是先將pdf先轉(zhuǎn)成txt,再把txt每個段落抓出來。網(wǎng)上看了下,絕大多數(shù)人都是用的pdfbox這個java類庫。網(wǎng)上的源碼實現(xiàn)很多,大同小異,隨便拿一個來用都行。發(fā)現(xiàn)轉(zhuǎn)倒是能轉(zhuǎn),可是原來的pdf格式全不見了是什么鬼,莫名其妙地給我多了很多空格,什么段落頂格全沒了,亂七八糟的排版,這樣我怎么將txt中的每個段落提取出來啊!!!!
上網(wǎng)查了很久,發(fā)現(xiàn)這是個很經(jīng)典的問題,貌似很多人都是這個問題。pdfbox會自動在某些讀取文字中加入一些格式,比如回車、空格等,造成了很不好的效果。什么itext、pdfbox都是這個問題。我甚至去下了一個專門pdf格式轉(zhuǎn)換的軟件,轉(zhuǎn)出來的效果那也是一個慘不忍睹(專業(yè)的都這樣,那還有什么搞頭)。就在我決定放棄的時候,看到一篇很古老的博客有說用到XPdf能比較好解決這個問題。那還說什么,馬上開始試驗。
一、XPDF的配置
1.我下載的是: xpdfbin-win-3.04.zip
另外還需要一個語言包:xpdf-chinese-simplified.tar.gz
2.工作路徑設(shè)置?
在本文中以 c:\xpdftest\xpdf 作為xpdf的工作路徑。 將?xpdfbin-win-3.04.zip 解壓到 c:\xpdftest\xpdf 下。 將 xpdf-chinese-simplified.tar.gz 解壓到 c:\xpdftest\xpdf\xpdf-chinese-simplified 下。
3.修改配置文件?
為了啟用中文簡體語言包,必須將 xpdf-chinese-simplified 目錄下的 sample-xpdfrc 文件進(jìn)行如下配置,并將其另存為 xpdfrc 文件 。
?注意:此文件為配置文件,而且名稱必須是 xpdfrc 。如果是別的名字,即使調(diào)用 pdftotext.exe 時,傳入 ” -cfg xpdfrc2 ” 來告訴 xpdf 配置文件的名字,好像 pdftotext.exe 也并沒有使用這個配置文件。所以為了減少誤解,請您將配置文件直接命名為 xpdfrc 。
?修改 sample-xpdfrc 文件之一?
在文件后面 加上一段話 :
?Txt代碼
#-----?begin?Chinese?Simplified?support?package?(2004-jul-27)?? ?? cidToUnicode?????Adobe-GB1??C:/xpdftest/xpdf/xpdf-chinese-simplified/Adobe-GB1.cidToUnicode?? ?? unicodeMap?ISO-2022-CN?????C:/xpdftest/xpdf/xpdf-chinese-simplified/ISO-2022-CN.unicodeMap?? ?? unicodeMap?EUC-CN???????C:/xpdftest/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap?? ?? unicodeMap?GBK??????C:/xpdftest/xpdf/xpdf-chinese-simplified/GBK.unicodeMap?? ?? cMapDir??????Adobe-GB1??C:/xpdftest/xpdf/xpdf-chinese-simplified/CMap?? ?? toUnicodeDir?????????????????C:/xpdf/chinese-simplified/CMap?? ?? #displayCIDFontTT???Adobe-GB1??/usr/..../gkai00mp.ttf?? ?? #-----?end?Chinese?Simplified?support?package ?
注意:路徑要跟自己配置的一樣。
修改 sample-xpdfrc 文件之二
?另外,配置文件中原先沒有加上一個“ textPageBreaks ”控制。為了避免這個分頁符號,我們需要在 sample-xpdfrc 文件 “ text output control ”下面 加上一段話 : Txt代碼
#?If?set?to?"yes",?text?extraction?will??insert??page?? #?breaks??(form?feed?characters)?between?pages.??This?? #?defaults?to?"yes".?? textPageBreaks??????no? 設(shè)置?textPageBreaks?為?no?的意思是:在?PDF?文檔的兩頁之間不加入分頁符號。?之所以這樣,是因為這個符號有時候會引起?SAX?解析?XML?上的困難。
?
?
配置文件中原先把?textEncoding?注釋了。這樣默認(rèn)的字符集是?Latin1?。我們必須打開它,并且就是指定?textEncoding?為UTF-8?,而不是?GB2312?。即修改這句話?:
Txt代碼
textEncoding????????UTF-8??
好了,配置弄好后就該代碼實現(xiàn)了,代碼不難,下面貼上來。
TestPdfToText.java
Java代碼
package?pdfToText; ? public?class?TestPdfToText?{?? ?? ????? ? ?? ????public?static?void?main(String[]?args)?{?? ????????String?rootPath?=?"c:\\061231";?? ?????????? ????????String?pdffile?=?rootPath?+?".pdf";?? ?????????? ????????String?xpdfToTxtfile?=?rootPath?+?"_xpdf.txt"; ? ?????????? ????????try{?? ????????????long?begin?=?System.currentTimeMillis();??? ????????????XpdfToText?xpToTxt?=?new?XpdfToText(pdffile);?? ????????????xpToTxt.toTextFile(xpdfToTxtfile);?? ????????????long?end?=?System.currentTimeMillis();??? ????????????System.out.println("xpdf\t?cost:\t"?+?(end?-?begin)?+?"?ms");?? ????????}catch(Exception?e){?? ????????????e.printStackTrace();?? ????????} ??? ????}?? } ?
XpdfToText.java
package?pdfToText;?? ?? import?java.io.File;?? import?java.io.IOException;?? ?? public?class?XpdfToText?{?? ?????? ????private?File?pdffile;?? ?????? ????private?String?CONVERTOR_STORED_PATH?=?"c:\\xpdftest\\xpdf\\";?? ?????? ????private?String?CONVERTOR_NAME?=?"pdftotext";?? ?? ?????? ????public?XpdfToText(String?pdffile)?throws?IOException?{?? ????????this.pdffile?=?new?File(pdffile);?? ????}?? ?? ?????? ????public?void?toTextFile(String?targetfile)?throws?IOException?{?? ????????toTextFile(targetfile,?true);?? ????}?? ?? ?????? ?????? ????public?void?toTextFile(String?targetfile,?boolean?isLayout)?? ????????????throws?IOException?{?? ????????String[]?cmd?=?getCmd(new?File(targetfile),?isLayout);?? ????????Runtime.getRuntime().exec(cmd);?? ????}?? ?? ?????? ????public?String?getCONVERTOR_STORED_PATH()?{?? ????????return?CONVERTOR_STORED_PATH;?? ????}?? ?? ?????? ????public?void?setCONVERTOR_STORED_PATH(String?path)?{?? ????????if?(!path.trim().endsWith("\\"))?? ????????????path?=?path.trim()?+?"\\";?? ????????this.CONVERTOR_STORED_PATH?=?path;?? ????}?? ?? ?????? ????private?String[]?getCmd(File?targetfile,?boolean?isLayout)?{?? ?? ?????????? ????????String?command?=?CONVERTOR_STORED_PATH?+?CONVERTOR_NAME;?? ?????????? ????????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";?? ?????????? ????????if?(!isLayout)?? ????????????layout?=?"";?? ????????return?new?String[]?{?command,?layout,?encoding,?character,?mistake,?? ????????????????nopagebrk,?source_absolutePath,?target_absolutePath?};?? ????}?? } ? 運(yùn)行結(jié)果還是挺可觀的,如下圖,格式什么的還是在的。
附上項目源碼下載地址
總結(jié)
以上是生活随笔為你收集整理的XPdf实现pdf转txt格式方法实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。