1. 程式人生 > >Java讀取多種檔案格式的檔案(pdf,pptx,ppt,doc,docx...)

Java讀取多種檔案格式的檔案(pdf,pptx,ppt,doc,docx...)

通過開源pdfbox和poi進行處理多種檔案格式的文字讀入

1.需要的jar的maven座標:

<dependency>
       <groupId>org.apache.pdfbox</groupId>
       <artifactId>pdfbox</artifactId>
       <version>2.0.2</version>
   </dependency>
   <!--  ppt,xls,docx,pptx,xlsx-->
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi</artifactId>
       <version>3.14</version>
   </dependency>
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml</artifactId>
       <version>3.14</version>
   </dependency>
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-ooxml-schemas</artifactId>
       <version>3.14</version>
   </dependency>
   <dependency>
       <groupId>org.apache.poi</groupId>
       <artifactId>poi-scratchpad</artifactId>
       <version>3.14</version>
   </dependency>
   <dependency>
       <groupId>org.apache.xmlbeans</groupId>
       <artifactId>xmlbeans</artifactId>
       <version>2.6.0</version>
   </dependency>
   <dependency>
       <groupId>dom4j</groupId>
       <artifactId>dom4j</artifactId>
       <version>1.6.1</version>
   </dependency>

處理多種檔案格式,詳情見程式碼:

package cn.lcg.utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.poi.hslf.extractor.PowerPointExtractor;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFSlideShow;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;

/**
 * 
 * @author yujian
 * @date   2016年10月12日
 * @version 0.0.1
 */
public class FileFormat {
    /**
     * 用來讀取doc檔案的方法
     * @param filePath
     * @return
     * @throws Exception
     */
    public static String getTextFromDoc(String filePath) throws Exception{
        StringBuilder sb = new StringBuilder();
            FileInputStream fis = new FileInputStream(new File(filePath));
            HWPFDocument doc = new HWPFDocument(fis);
            Range rang = doc.getRange();
            sb.append(rang.text());    
            fis.close();
            return sb.toString();
        
    }
    /**
     * 用來讀取docx檔案
     * @param filePath
     * @return
     * @throws IOException 
     * @throws Exception
     */
    @SuppressWarnings("resource")
    public static String getTextFromDocx(String filePath) throws IOException {
        FileInputStream in = new FileInputStream(filePath);
        XWPFDocument doc = new XWPFDocument(in);
        XWPFWordExtractor extractor = new XWPFWordExtractor(doc);
        String text = extractor.getText();
        in.close();
        return text;
    }
    /**
     * 用來讀取pdf檔案
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getTextFromPDF(String filePath) throws IOException{
            File input = new File(filePath);
            PDDocument pd = PDDocument.load(input);
            PDFTextStripper stripper = new PDFTextStripper();
            return stripper.getText(pd);
    }
    /**
     * 用來讀取ppt檔案
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getTextFromPPT( String filePath) throws IOException{
        FileInputStream in = new FileInputStream(filePath);
        PowerPointExtractor extractor = new PowerPointExtractor(in);
        String content = extractor.getText();
        extractor.close();
        return content;
    }
    /**
     * 用來讀取pptx檔案
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getTextFromPPTX( String filePath) throws IOException{
        String resultString = null;
        StringBuilder sb = new StringBuilder();
        FileInputStream in = new FileInputStream(filePath);
        try {
            XMLSlideShow xmlSlideShow = new XMLSlideShow(in);
            List<XSLFSlide> slides = xmlSlideShow.getSlides();
            for(XSLFSlide slide:slides){
                CTSlide rawSlide = slide.getXmlObject();
                CTGroupShape gs = rawSlide.getCSld().getSpTree();
                CTShape[] shapes = gs.getSpArray();
                for(CTShape shape:shapes){
                    CTTextBody tb = shape.getTxBody();
                    if(null==tb){
                        continue;
                    }
                    CTTextParagraph[] paras = tb.getPArray();
                    for(CTTextParagraph textParagraph:paras){
                        CTRegularTextRun[] textRuns = textParagraph.getRArray();
                        for(CTRegularTextRun textRun:textRuns){
                            sb.append(textRun.getT());
                        }
                    }
                }
            }
            resultString = sb.toString();
            xmlSlideShow.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultString;
    }
    /**
     * 用來讀取xls
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getTextFromxls(String filePath) throws IOException{
        FileInputStream in = new FileInputStream(filePath);
        StringBuilder content = new StringBuilder();
        HSSFWorkbook workbook = new HSSFWorkbook(in);
        for(int sheetIndex=0;sheetIndex<workbook.getNumberOfSheets();sheetIndex++){
            HSSFSheet sheet = workbook.getSheetAt(sheetIndex);
            for(int rowIndex=0;rowIndex<=sheet.getLastRowNum();rowIndex++){
                HSSFRow row = sheet.getRow(rowIndex);
                if(row==null){
                    continue;
                }
                for(int cellnum=0;cellnum<row.getLastCellNum();cellnum++){
                    HSSFCell cell = row.getCell(cellnum);
                    if(cell!=null){
                        content.append(cell.getRichStringCellValue().getString()+" ");
                    }
                        
                }
            }
            
        }
        workbook.close();
        return content.toString();
        
    }
    /**
     * 用來讀取xlsx檔案
     * @param filePath
     * @return
     * @throws IOException
     */
    public static String getTextFromxlsx(String filePath) throws IOException{
        StringBuilder content = new StringBuilder();
        XSSFWorkbook workbook = new XSSFWorkbook(filePath);
        for(int sheet=0;sheet<workbook.getNumberOfSheets();sheet++){
            if(null!=workbook.getSheetAt(sheet)){
                XSSFSheet aSheet =workbook.getSheetAt(sheet);
                for(int row=0;row<=aSheet.getLastRowNum();row++){
                    if(null!=aSheet.getRow(row)){
                        XSSFRow aRow = aSheet.getRow(row);
                        for(int cell=0;cell<aRow.getLastCellNum();cell++){
                            if(null!=aRow.getCell(cell)){
                                XSSFCell aCell = aRow.getCell(cell);
                                if(convertCell(aCell).length()>0){
                                    content.append(convertCell(aCell));
                                }
                            }
                            content.append(" ");
                        }
                    }
                }
            }
        }
        workbook.close();
        return content.toString();
        
    }
    
    private static String convertCell(Cell cell){
        NumberFormat formater = NumberFormat.getInstance();
        formater.setGroupingUsed(false);
        String cellValue="";
        if(cell==null){
            return cellValue;
        }
        
        switch(cell.getCellType()){
            case HSSFCell.CELL_TYPE_NUMERIC:
                cellValue = formater.format(cell.getNumericCellValue());
                break;
            case HSSFCell.CELL_TYPE_STRING:
                cellValue = cell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_BLANK:
                cellValue = cell.getStringCellValue();
                break;
            case HSSFCell.CELL_TYPE_BOOLEAN:
                cellValue = Boolean.valueOf(cell.getBooleanCellValue()).toString();
                break;
            case HSSFCell.CELL_TYPE_ERROR:
                cellValue = String.valueOf(cell.getErrorCellValue());
                break;
            default:cellValue="";
        }
        return cellValue.trim();
    }
}

相關推薦

Java讀取多種檔案格式檔案pdf,pptx,ppt,doc,docx...

通過開源pdfbox和poi進行處理多種檔案格式的文字讀入 1.需要的jar的maven座標: <dependency> <groupId>org.apache.pdfbox</groupId> <

java讀取檔案和寫入檔案的方式位元組流和字元流

java讀取檔案和寫入檔案的方式 以位元組為單位讀取檔案 一次讀一個位元組 一次讀多個位元組 以字元為單位讀取檔案 一次讀一個字元 一次讀多個字元 以位元組為單位讀取檔案 以位元

javapdf檔案的管理pdf檔案轉png檔案,base64傳輸檔案以及刪除

這幾天根據需求做了一個小demo,從中學習了一些java中pdf檔案的管理和檔案轉base64,主要包括以下幾個方面: 1.前端上傳影像檔案,把影像檔案儲存到指定的路徑下,然後如果是pdf檔案,把pdf檔案轉換為對應的png檔案儲存到pdf檔案儲存地址同級的指定資料夾中,同時保留原pdf檔案,如下圖:  pd

Java讀寫CSV格式檔案opencsv

一,讀取CSV格式檔案: import java.io.File; import java.io.FileReader; import java.util.List; import au.com.bytecode.opencsv.CSVReader; public c

12-Java讀寫CSV格式檔案opencsv

maven依賴 <!-- https://mvnrepository.com/artifact/net.sourceforge.javacsv/javacsv --> <de

java 讀取eml檔案附件方法附件為base64轉碼

/*** 建立amr檔案* @param file * @param strEmailEml* @throws Exception */private static void createAmrFile(String strEmailEml) throws Exception {Properties prop

java讀取不同編碼格式檔案

public static String getJavaEncode(String filePath){         BytesEncodingDetect s = new BytesEncodingDetect();          String fileCode =

Java讀取UTF-8格式txt檔案第一行出現亂碼——問號“?”及解決

    今天匯入檔案的時候,出現?,經過核查是UTF-8那個BOM的問題,最後經過查詢,找了一個比較好的方法解決。 使用一個更強大點的工具類(可以支援UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE):    附上這兩個類的程式碼,

PE檔案格式學習:總體結構

1.概述 PE檔案分為幾個部分,分別是: DOS頭 DOS Stub NT頭(PE頭) 檔案頭 可選頭 區段頭(一個數組,每個元素都是一個結構體,稱之為IMAGE_SECTION_HEADER) .text .rdata .data .rs

PE檔案格式學習:匯出表

1.回顧 上篇文章中介紹過,可選頭中的資料目錄表是一個大小為0x10的陣列,匯出表就是這個陣列中的第一個元素。 我們再回顧下資料目錄表的結構體: struct _IMAGE_DATA_DIRECTORY {     DWORD VirtualAddress;    

PE檔案格式學習:概述

1.PE檔案簡介 PE檔案格式是Windows系統中應用最廣泛的檔案格式之一,我們常見的可執行檔案.exe、動態連結庫.dll以及驅動檔案.sys等都是PE檔案格式的。 可以通過十六進位制工具如010editor檢視PE檔案,可以看到PE檔案都有一個共同的特點,就是它們的最開頭都是4D5A,也就是ASCI

PE檔案格式學習十三:載入配置表

1.介紹 載入配置表早期是用於描述當PE檔案頭或PE可選頭無法描述或者因為太大而無法描述的各種功能。 後來以XP及以後的系統主要是為了儲存SEH控制代碼,稱為安全結構化異常處理程式列表,如果SEH異常處理沒有經過註冊,在載入配置表中沒有控制代碼,這個異常處理就不會被執行。 具體的例子就不演示了,看起來只要是

PE檔案格式學習十四:繫結匯入表

1.介紹 繫結匯入表的作用是加快程式的啟動速度,一個PE程式在啟動時會去載入匯入表中的dll檔案,並將匯入表的FirstThunk指向的陣列填入函式的真實地址,這需要耗去時間,繫結匯入表中儲存了匯入函式的真實地址,所以當PE在啟動時系統檢測到有繫結匯入表,就會直接將地址填入FirstThunk裡,這樣就省去

PE檔案格式學習十六:延遲載入表

1.介紹 延遲載入表本質上跟繫結匯入表的目的是一樣的,都是為了加快程式載入檔案的速度,只不過方法不一樣。 延遲載入是指在呼叫某個DLL時才去載入,目的是為了避免在程式啟動之初就載入了不必要的DLL而浪費了時間。微軟建議在兩種情況下使用延遲載入: 程式並非在啟動時就會呼叫D

PE檔案格式學習十二:TLS表

1.介紹 TLS全稱執行緒區域性儲存器,它用來儲存變數或回撥函式。 TLS裡面的變數和回撥函式都在程式入口點(AddressOfEntry)之前執行,也就是說程式在被除錯時,還沒有在入口點處斷下來之前,TLS中的變數和回撥函式就已經執行完了,所以TLS可以用作反除錯之類的操作。

PE檔案格式學習:基址重定位表

1.簡介 基址重定位表位於資料目錄表中的第六個,它位於安全表的後面。 這個表的作用是用來索引那些需要重定位的資料的。當系統發現DLL的真實載入基址跟PE檔案中的ImageBase中的值不一樣時,就會啟用基址重定位表修復一些資料的地址。我們知道一個程式中可能包含多個DLL,因此有可

PE檔案格式學習:安全表

1.介紹 如果一個應用程式有數字簽名,那麼它的安全表就不會為空。它位於異常表的後面。 2.安全表解析 通過資料目錄表裡提供的RVA,我們轉換成offset,找到了安全表的位置,如下: 安全表的結構體如下: typedef struct _WIN_CERTIFIC

PE檔案格式學習:異常表

1.概述 x86系統採用動態的方式構建SEH結構,相比而言x64系統下采用靜態的方式處理SEH結構,它儲存在PE檔案中,通常在.pdata區段。因此本文的例子採用x64編譯過的程式。 異常表在資源表的後面。 2.異常表解析 資料目錄表的第四個元素指向異常表,RVA指向的是

PE檔案格式學習:資源表

1.概述 程式內部和外部的介面等元素的二進位制資料統稱為資源,程式把它們放在一個特定的表中,符合資料和程式分離的設計原則。 Windows程式中的資源大致分為六類:選單、對話方塊、點陣圖、游標、圖示、自定義資源 資源表是資料目錄表中的第三個元素,排在匯入表的後面。 2.資

PE檔案格式學習:匯入表

UPDATE: 在文章的末尾更新了一張圖,在網上找的,有助於理解匯入表的結構 1.概述 匯入表是逆向和病毒分析中比較重要的一個表,在分析病毒時幾乎第一時間都要看一下程式的匯入表的內容,判斷程式大概用了哪些功能。 匯入表是資料目錄表中的第2個元素,排在匯出表的