Java讀取PDF文字內容的方法

最後編輯時間 :2015-01-0517:30

 

方法一:PDFBox

(一個BSD許可下的源碼開放項目)是一個爲開發人員讀取和創建PDF文檔而準備的純Java類庫。它提供如下特性:

提取文本,包括Unicode字符。和Jakarta Lucene等文本搜索引擎的整合過程十分簡單。加密/解密PDF文檔。從PDF和XFDF格式中導入或導出表單數據。向已有PDF文檔中追加內容。將一個PDF文檔切分爲多個文檔,覆蓋PDF文檔。

官網:http://pdfbox.apache.org/index.html    截止當前最新版本1.8.8

 

/**

 * PdfboxUtil.java

 * Create on 2015-1-5

 */

package charlie.utils.pdf;

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileWriter;

import java.io.InputStream;

 

import org.apache.pdfbox.pdfparser.PDFParser;

import org.apache.pdfbox.pdmodel.PDDocument;

import org.apache.pdfbox.util.PDFTextStripper;

 

/**

 * @author CharlieChen

 * @DateTime 2015-1-5 上午9:55:38

 * @version 1.0

 */

public class PdfboxUtil {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

      String pdfPath = "D:/temp/成交單-PDF格式.pdf";

      String txtfilePath = "D:/temp/成交單-PDF格式-pdfbox.txt";

      PdfboxUtil pdfutil = new PdfboxUtil();

      try {

         String content = pdfutil.getTextFromPdf(pdfPath);

         pdfutil.toTextFile(content, txtfilePath);

         System.out.println("Finished !");      

      } catch (Exception e) {

         e.printStackTrace();

      }

 

   }

  

   /**

    * 讀取PDF文件的文字內容

    * @param pdfPath

    * @throws Exception

    */

   public String getTextFromPdf(String pdfPath) throws Exception {

      // 是否排序

      boolean sort = false;

      // 開始提取頁數

      int startPage = 1;

      // 結束提取頁數

      int endPage = Integer.MAX_VALUE;    

     

      String content = null;

      InputStream input = null;

      File pdfFile = new File(pdfPath);

      PDDocument document = null;

      try {

         input = new FileInputStream(pdfFile);

         // 加載 pdf 文檔

         PDFParser parser = new PDFParser(input);

         parser.parse();

         document = parser.getPDDocument();

         // 獲取內容信息

         PDFTextStripper pts = new PDFTextStripper();

         pts.setSortByPosition(sort);

         endPage = document.getNumberOfPages();

         System.out.println("Total Page: " + endPage);

         pts.setStartPage(startPage);

         pts.setEndPage(endPage);

         try {

            content = pts.getText(document);

         } catch (Exception e) {

            throw e;

         }

         System.out.println("Get PDF Content ...");

      } catch (Exception e) {

         throw e;

      } finally {

         if (null != input)

            input.close();

         if (null != document)

            document.close();

      }

     

      return content;

   }

 

   /**

    * PDF文件內容寫入到txt文件中

    * @param pdfContent

    * @param filePath

    */

   public void toTextFile(String pdfContent,String filePath) {     

      try {

         File f = new File(filePath);

         if (!f.exists()) {

            f.createNewFile();

         }

         System.out.println("Write PDF Content to txt file ...");

         BufferedWriter output = new BufferedWriter(new FileWriter(f));

         output.write(pdfContent);

         output.close();

      } catch (Exception e) {

         e.printStackTrace();

      }

   }

}

 

另需要commons-logging和fontbox-1.8.8的jar包

 

pdfbox只能做到把文字分析出來,並無法很好的控制分析的順序,格式,字體等信息。

排序sort爲true後,PDF按行讀取,保持了順序,但是遇到分欄,分頁就會需要額外處理

 

 

 

方法二:iText

用於能夠快速產生PDF文檔的一個java類庫。通過iText不僅可以生成PDF或rtf的文檔,而且可以將XML、Html文件轉化爲PDF文件。支持文本,表格,圖形的操作,可以方便的跟 Servlet 進行結合。

 

/**

 * ItextpdfUtil.java

 * Create on 2015-1-5

 * import iText-5.0.2.jar

 */

package charlie.utils.pdf;

 

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

import com.itextpdf.text.pdf.PdfReader;

import com.itextpdf.text.pdf.parser.PdfReaderContentParser;

import com.itextpdf.text.pdf.parser.PdfTextExtractor;

import com.itextpdf.text.pdf.parser.SimpleTextExtractionStrategy;

import com.itextpdf.text.pdf.parser.TextExtractionStrategy;

/**

 * @author CharlieChen

 * @DateTime 2015-1-5 上午11:43:26

 * @version 1.0

 */

public class ItextpdfUtil {

 

   /**

    * @param args

    */

   public static void main(String[] args) {

     

      String pdfPath = "D:/temp/成交單-PDF格式.pdf";

      String txtfilePath = "D:/temp/成交單-PDF格式-itext.txt";     

     

       //readPdfToTxt(pdfPath,txtfilePath); //調用讀取方法

       System.out.println(readPdfToTxt(pdfPath));

       System.out.println("Finished !");

      

   }

 

   /**

    * 讀取PDF文件內容到txt文件

    *

    * @param writer

    * @param pdfPath

    */

   private static void readPdfToTxt(String pdfPath,String txtfilePath) {

      // 讀取pdf所使用的輸出流

      PrintWriter writer = null;

      PdfReader reader = null;

      try {

         writer = new PrintWriter(new FileOutputStream(txtfilePath));

         reader = new PdfReader(pdfPath);

         int num = reader.getNumberOfPages();// 獲得頁數

         System.out.println("Total Page: " + num);

         String content = ""; // 存放讀取出的文檔內容

         for (int i = 1; i <= num; i++) {

            // 讀取第i頁的文檔內容

            content += PdfTextExtractor.getTextFromPage(reader, i);

         }

         String[] arr = content.split("/n");

         for(int i=0;i<arr.length;i++){

            System.out.println(arr[i]);

            /*String[] childArr = arr[i].split(" ");

            for(int j=0;j<childArr.length;j++){

                System.out.println(childArr[j]);

            }*/

         }    

        

         //System.out.println(content);

        

         writer.write(content);// 寫入文件內容

         writer.flush();

         writer.close();

      } catch (IOException e) {

         e.printStackTrace();

      }

   }

  

   /**

    * 讀取pdf內容

    * @param pdfPath

    */

   private static String readPdfToTxt(String pdfPath) {

      PdfReader reader = null;

      StringBuffer buff = new StringBuffer();

      try {

         reader = new PdfReader(pdfPath);

         PdfReaderContentParser parser = new PdfReaderContentParser(reader);

         int num = reader.getNumberOfPages();// 獲得頁數

         TextExtractionStrategy strategy;

         for (int i = 1; i <= num; i++) {

            strategy = parser.processContent(i,

                   new SimpleTextExtractionStrategy());

            buff.append(strategy.getResultantText());

         }

      } catch (IOException e) {

         e.printStackTrace();

      } 

     

      return buff.toString();

   }

}

 

 

 

 

 

 

 

 

 

方法三:XPDF

xpdf是一個開源項目,我們可以調用他的本地方法來實現抽取中文pdf文件。過程複雜,參照以下博客:

在linux下如何安裝xpdf:http://blog.chinaunix.net/uid-7591044-id-1742951.html

 

Window系統安裝xpdf : http://blog.csdn.net/jiuyueguang/article/details/10083965

http://www.thinksaas.cn/group/topic/149121/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章