使用PDFBox處理PDF文檔.doc_第1頁
使用PDFBox處理PDF文檔.doc_第2頁
使用PDFBox處理PDF文檔.doc_第3頁
使用PDFBox處理PDF文檔.doc_第4頁
使用PDFBox處理PDF文檔.doc_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

使用PDFBox處理PDF文檔 在本書的前面所介紹的內(nèi)容中,所處理的都是純文本文件。但是事實上,人們用于保存信息的文件并不是純文本格式?,F(xiàn)在比較流行的文件存儲格式有Adobe公司的PDF和Microsoft的Word、Excel等。在處理這些文件的時候,不能簡單的從文件讀取字符,需要根據(jù)他們特殊的格式提取內(nèi)容。本章就將對比較流行的PDF、Word和Excel格式的處理工具逐一進行介紹。7.1 使用PDFBox處理PDF文檔PDF全稱Portable Document Format,是Adobe公司開發(fā)的電子文件格式。這種文件格式與操作系統(tǒng)平臺無關,可以在Windows、Unix或Mac OS等操作系統(tǒng)上通用。PDF文件格式將文字、字型、格式、顏色及獨立于設備和分辨率的圖形圖像等封裝在一個文件中。如果要抽取其中的文本信息,需要根據(jù)它的文件格式來進行解析。幸好目前已經(jīng)有不少工具能幫助我們做這些事情。7.1.1 PDFBox的下載最常見的一種PDF文本抽取工具就是PDFBox了,訪問網(wǎng)址/projects/pdfbox/,進入如圖7-1所示的下載界面。圖7-1 PDFBox的下載頁面讀者可以在該網(wǎng)頁下載其最新的版本。本書采用的是PDFBox-0.7.3版本。PDFBox是一個開源的Java PDF庫,這個庫允許你訪問PDF文件的各項信息。在接下來的例子中,將演示如何使用PDFBox提供的API,從一個PDF文件中提取出文本信息。7.1.2 在Eclipse中配置以下是在Eclipse中創(chuàng)建工程,并建立解析PDF文件的工具類的過程。(1)在Eclipse的workspace中創(chuàng)建一個普通的Java工程:ch7。(2)把下載的PDFBox-0.7.3.zip解壓,解壓后的目錄結(jié)構(gòu)如圖7-2所示。圖7-2 解壓后的PDFBox包(3)進入external目錄下,可以看到,這里包括了PDFBox所有用到的外部包。復制下面的Jar包到工程ch7的lib目錄下(如還未建立lib目錄,則先創(chuàng)建一個)。l bcmail-jdk14-132.jarl bcprov-jdk14-132.jarl checkstyle-all-4.2.jarl FontBox-0.1.0-dev.jarl lucene-core-2.0.0.jar然后再從PDFBox的lib目錄下,復制PDFBox-0.7.3.jar到工程的lib目錄下。(4)在工程上單擊右鍵,在彈出的快捷菜單中選擇“Build Path-Config Build Path-Add Jars”命令,把工程lib目錄下面的包都加入工程的Build Path。筆者機器上完整的工程目錄如圖7-3所示:圖7-3 工程截圖7.1.3 使用PDFBox解析PDF內(nèi)容在剛剛創(chuàng)建的Eclipse工程中,創(chuàng)建一個ch7.pdfbox包,并創(chuàng)建一個PdfboxTest類。該類包含一個getText方法,用于從一個PDF中獲取文本信息,其代碼如下。代碼7.1public void geText(String file) throws Exception / 是否排序 boolean sort = false;/ pdf文件名 String pdfFile = file;/ 輸入文本文件名稱 String textFile = null;/ 編碼方式 String encoding = UTF-8;/ 開始提取頁數(shù) int startPage = 1;/ 結(jié)束提取頁數(shù) int endPage = Integer.MAX_VALUE;/ 文件輸入流,生成文本文件 Writer output = null;/ 內(nèi)存中存儲的PDF Document PDDocument document = null;try try / 首先當作一個URL來裝載文件,如果得到異常再從本地文件系統(tǒng)/去裝載文件 URL url = new URL(pdfFile); document = PDDocument.load(url); / 獲取PDF的文件名 String fileName = url.getFile(); / 以原來PDF的名稱來命名新產(chǎn)生的txt文件 if (fileName.length() 4) File outputFile = new File(fileName.substring(0, fileName.length() - 4) + .txt); textFile = outputFile.getName(); catch (MalformedURLException e) / 如果作為URL裝載得到異常則從文件系統(tǒng)裝載 document = PDDocument.load(pdfFile); if (pdfFile.length() 4) textFile = pdfFile.substring(0, pdfFile.length() - 4) + .txt; / 文件輸入流,寫入文件倒textFile output = new OutputStreamWriter(new FileOutputStream(textFile), encoding); / PDFTextStripper來提取文本 PDFTextStripper stripper = null; stripper = new PDFTextStripper();/ 設置是否排序 stripper.setSortByPosition(sort);/ 設置起始頁 stripper.setStartPage(startPage);/ 設置結(jié)束頁 stripper.setEndPage(endPage);/ 調(diào)用PDFTextStripper的writeText提取并輸出文本 stripper.writeText(document, output); finally if (output != null) / 關閉輸出流 output.close(); if (document != null) / 關閉PDF Document document.close(); 在上面的代碼中,getText方法接收一個String類型的參數(shù),指定要提取的PDF文件路徑。這個位置可以是一個URL或本地文件。然后函數(shù)調(diào)用PDFBox提供的PDFTextStripper類,設置提取過程中的一些屬性(如起始頁、是否排序等)。最后將文本提取并寫入文件。7.1.4 運行效果下面看一下這個函數(shù)的運行效果,在PdfboxTest加入一個main函數(shù),其代碼如下。public static void main(String args) PdfboxTest test = new PdfboxTest(); try / 取得C盤下的index.pdf的內(nèi)容 test.geText(C:index.pdf); catch (Exception e) e.printStackTrace(); 這里要處理一個index.pdf文件,該PDF文件的內(nèi)容如圖7-4所示。圖7-4 要解析的PDF文檔內(nèi)容通過PdfboxTest處理后的文本文件如圖7-5所示。圖7-5 處理的結(jié)果可以看到,PDF中的文本已經(jīng)被提取出來,保存于文本文件中了。其中第4行的超鏈接部分“POI News WebBlog”,在文本文件中已經(jīng)被替換成了普通的純文本。讀者可以根據(jù)PDFBox所提供的API文檔進一步查詢其他功能。7.1.5 與Lucene的集成PDFBox還提供和Lucene的集成,它提供了一套簡單的方法把PDF Documents加入到Lucene的索引中去,請看以下代碼:Document lucenedocument = LucenePDFDocument.getDocument();其中,LucenePDFDocument是PDFBox中提供的一個類,它的getDocument被重載為3個方法,分別接收一個File對象、InputStream對象或者URL對象作為參數(shù),然后從該參數(shù)傳遞進來的PDF文件中,提取并生成Lucene的Document對象。當通過PDFBox從一個PDF文檔中得到一個Lucene Document后,可以直接使用IndexWriter把它加到Lucene的index中。LucenePDFDocument自動從PDF文件中提取各種元數(shù)據(jù)Field,并把它們加入到Document中。它提取的信息如表7-1所示。表7-1 PDFBox生成的Lucene Document格式Lucene Field名稱說明path文件系統(tǒng)路徑(如果文檔是從文件裝載)urlURL地址(如果文檔是從網(wǎng)絡裝載)contents整個Document的內(nèi)容,索引但不存儲summaryDocument的內(nèi)容前500個字符modified最后修改時間uidDocument的惟一IDCreationDate從PDF的meta-data獲取Creator從PDF的meta-data獲取Keywords從PDF的meta-data獲取ModificationDate從PDF的meta-data獲取Producer從PDF的meta-data獲取Subject從PDF的meta-data獲取Trapped從PDF的meta-data獲取下面通過LucenePDFDocument,直接對PDF建立索引,在ch7.pdfbox包下面新建一個PdfLuceneTest類,該類的代碼如下。代碼7.2public class PdfLuceneTest public static void main(String args) try / IndexWriter存放索引到d:index下 IndexWriter writer = new IndexWriter(d:index, new StandardAnalyzer(), true); / LucenePDFDocument返回由PDF產(chǎn)生的Lucene Docuement Document d = LucenePDFDocument .getDocument(new File(C:index.pdf); / 寫入索引 writer.addDocument(d); / 關閉索引文件流 writer.close(); / 讀取d:index下的索引文件建立IndexSearcher IndexSearcher searcher = new IndexSearcher(d:index); / 對索引的contents Field進行查找關鍵詞poi Term t = new Term(contents, poi); / 根據(jù)Term生成Query Query q = new TermQuery(t); / 搜索返回結(jié)果集 Hits hits = searcher.search(q); / 打印結(jié)果集 for (int i = 0; i hits.length(); i+) System.out.println(hits.do

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論