最後編輯時間 :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