日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XPdf实现pdf转txt格式方法实现

發(fā)布時間:2024/1/1 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?上的困難。

    ?

    ?

    • 修改?sample-xpdfrc?文件之三

    配置文件中原先把?textEncoding?注釋了。這樣默認(rèn)的字符集是?Latin1?。我們必須打開它,并且就是指定?textEncoding?UTF-8?,而不是?GB2312?。即修改這句話?:

    Txt代碼
  • textEncoding????????UTF-8??

  • 好了,配置弄好后就該代碼實現(xiàn)了,代碼不難,下面貼上來。


    TestPdfToText.java

    Java代碼
  • package?pdfToText; ?
  • public?class?TestPdfToText?{??
  • ??
  • ????/**?
  • ?????*?@param?args?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?{??
  • ????????String?rootPath?=?"c:\\061231";??
  • ????????//pdf文件路徑??
  • ????????String?pdffile?=?rootPath?+?".pdf";??
  • ????????//用xpdf生成的txt文件路徑??
  • ????????String?xpdfToTxtfile?=?rootPath?+?"_xpdf.txt"; ?
  • ????????//XPDF??
  • ????????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?{??
  • ????//?PDF文件名??
  • ????private?File?pdffile;??
  • ????//?轉(zhuǎn)換器的存放位置,默認(rèn)在c:\xpdftest\xpdf下面??
  • ????private?String?CONVERTOR_STORED_PATH?=?"c:\\xpdftest\\xpdf\\";??
  • ????//?轉(zhuǎn)換器的名稱,默認(rèn)為pdftotext??
  • ????private?String?CONVERTOR_NAME?=?"pdftotext";??
  • ??
  • ????//?構(gòu)造函數(shù),參數(shù)為pdf文件的路徑??
  • ????public?XpdfToText(String?pdffile)?throws?IOException?{??
  • ????????this.pdffile?=?new?File(pdffile);??
  • ????}??
  • ??
  • ????//?將pdf轉(zhuǎn)為文本文檔,參數(shù)為目標(biāo)文件的路徑??
  • ????public?void?toTextFile(String?targetfile)?throws?IOException?{??
  • ????????toTextFile(targetfile,?true);??
  • ????}??
  • ??
  • ????//?將pdf轉(zhuǎn)為文本文檔,參數(shù)1為目標(biāo)文件的路徑,??
  • ????//?參數(shù)2為true則表示使用PDF文件中的布局??
  • ????public?void?toTextFile(String?targetfile,?boolean?isLayout)??
  • ????????????throws?IOException?{??
  • ????????String[]?cmd?=?getCmd(new?File(targetfile),?isLayout);??
  • ????????Runtime.getRuntime().exec(cmd);??
  • ????}??
  • ??
  • ????//?獲取PDF轉(zhuǎn)換器的路徑??
  • ????public?String?getCONVERTOR_STORED_PATH()?{??
  • ????????return?CONVERTOR_STORED_PATH;??
  • ????}??
  • ??
  • ????//?設(shè)置PDF轉(zhuǎn)換器的路徑??
  • ????public?void?setCONVERTOR_STORED_PATH(String?path)?{??
  • ????????if?(!path.trim().endsWith("\\"))??
  • ????????????path?=?path.trim()?+?"\\";??
  • ????????this.CONVERTOR_STORED_PATH?=?path;??
  • ????}??
  • ??
  • ????//?解析命令行參數(shù)??
  • ????private?String[]?getCmd(File?targetfile,?boolean?isLayout)?{??
  • ??
  • ????????//?命令字符??
  • ????????String?command?=?CONVERTOR_STORED_PATH?+?CONVERTOR_NAME;??
  • ????????//?PDF文件的絕對路徑??
  • ????????String?source_absolutePath?=?pdffile.getAbsolutePath();??
  • ????????//?輸出文本文件的絕對路徑??
  • ????????String?target_absolutePath?=?targetfile.getAbsolutePath();??
  • ????????//?保持原來的layout??
  • ????????String?layout?=?"-layout";??
  • ????????//?設(shè)置編碼方式??
  • ????????String?encoding?=?"-enc";??
  • ????????String?character?=?"GBK";??
  • ????????//?設(shè)置不打印任何消息和錯誤??
  • ????????String?mistake?=?"-q";??
  • ????????//?頁面之間不加入分頁??
  • ????????String?nopagebrk?=?"-nopgbrk";??
  • ????????//?如果isLayout為false,則設(shè)置不保持原來的layout??
  • ????????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)容還不錯,歡迎將生活随笔推薦給好友。