Java實現辦公文檔在線預覽功能

java實現辦公文件在線預覽功能是一個大傢在工作中也許會遇到的需求,網上些公司專門提供這樣的服務,不過需要收費

如果想要免費的,可以用openoffice,實現原理就是:

通過第三方工具openoffice,將word、excel、ppt、txt等文件轉換為pdf文件流;

當然如果裝瞭Adobe Reader XI,那把pdf直接拖到瀏覽器頁面就可以直接打開預覽,前提就是瀏覽器支持pdf文件瀏覽。

我這裡介紹通過poi實現word、excel、ppt轉pdf流,這樣就可以在瀏覽器上實現預覽瞭。

1.到官網下載Apache OpenOffice 安裝包,安裝運行。(不同系統的安裝方法,自行百度,這裡不做過多說明)

2.再項目的pom文件中引入依賴

        <!--openoffice-->
        <dependency>
            <groupId>com.artofsolving</groupId>
            <artifactId>jodconverter</artifactId>
            <version>2.2.1</version>
        </dependency>

3.將word、excel、ppt轉換為pdf流的工具類代碼

 
import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.DocumentFormat;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
 
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
 
 
/**
 * 文件格式轉換工具類
 *
 * @author tarzan
 * @version 1.0
 * @since JDK1.8
 */
public class FileConvertUtil {
    /** 默認轉換後文件後綴 */
    private static final String DEFAULT_SUFFIX = "pdf";
    /** openoffice_port */
    private static final Integer OPENOFFICE_PORT = 8100;
 
    /**
     * 方法描述 office文檔轉換為PDF(處理本地文件)
     *
     * @param sourcePath 源文件路徑
     * @param suffix     源文件後綴
     * @return InputStream 轉換後文件輸入流
     * @author tarzan
     */
    public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
        File inputFile = new File(sourcePath);
        InputStream inputStream = new FileInputStream(inputFile);
        return covertCommonByStream(inputStream, suffix);
    }
 
    /**
     * 方法描述  office文檔轉換為PDF(處理網絡文件)
     *
     * @param netFileUrl 網絡文件路徑
     * @param suffix     文件後綴
     * @return InputStream 轉換後文件輸入流
     * @author tarzan
     */
    public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
        // 創建URL
        URL url = new URL(netFileUrl);
        // 試圖連接並取得返回狀態碼
        URLConnection urlconn = url.openConnection();
        urlconn.connect();
        HttpURLConnection httpconn = (HttpURLConnection) urlconn;
        int httpResult = httpconn.getResponseCode();
        if (httpResult == HttpURLConnection.HTTP_OK) {
            InputStream inputStream = urlconn.getInputStream();
            return covertCommonByStream(inputStream, suffix);
        }
        return null;
    }
 
    /**
     * 方法描述  將文件以流的形式轉換
     *
     * @param inputStream 源文件輸入流
     * @param suffix      源文件後綴
     * @return InputStream 轉換後文件輸入流
     * @author tarzan
     */
    public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
        connection.connect();
        DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
        DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
        DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
        DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
        converter.convert(inputStream, sourceFormat, out, targetFormat);
        connection.disconnect();
        return outputStreamConvertInputStream(out);
    }
 
    /**
     * 方法描述 outputStream轉inputStream
     *
     * @author tarzan
     */
    public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
        ByteArrayOutputStream baos=(ByteArrayOutputStream) out;
        return new ByteArrayInputStream(baos.toByteArray());
    }
 
 
 
    public static void main(String[] args) throws IOException {
        //convertNetFile("http://172.16.10.21/files/home/upload/department/base/201912090541573c6abdf2394d4ae3b7049dcee456d4f7.doc", ".pdf");
        //convert("c:/Users/admin/Desktop/2.pdf", "c:/Users/admin/Desktop/3.pdf");
    }
}

4.serve層在線預覽方法代碼

 /**
     * @Description:系統文件在線預覽接口
     * @Author: tarzan
     */
    public void onlinePreview(String url, HttpServletResponse response) throws Exception {
        //獲取文件類型
        String[] str = SmartStringUtil.split(url,"\\.");
 
        if(str.length==0){
            throw new Exception("文件格式不正確");
        }
        String suffix = str[str.length-1];
        if(!suffix.equals("txt") && !suffix.equals("doc") && !suffix.equals("docx") && !suffix.equals("xls")
                && !suffix.equals("xlsx") && !suffix.equals("ppt") && !suffix.equals("pptx")){
            throw new Exception("文件格式不支持預覽");
        }
        InputStream in=FileConvertUtil.convertNetFile(url,suffix);
        OutputStream outputStream = response.getOutputStream();
        //創建存放文件內容的數組
        byte[] buff =new byte[1024];
        //所讀取的內容使用n來接收
        int n;
        //當沒有讀取完時,繼續讀取,循環
        while((n=in.read(buff))!=-1){
            //將字節數組的數據全部寫入到輸出流中
            outputStream.write(buff,0,n);
        }
        //強制將緩存區的數據進行輸出
        outputStream.flush();
        //關流
        outputStream.close();
        in.close();
    }

5.controler層代碼 

    @ApiOperation(value = "系統文件在線預覽接口 by tarzan")
    @PostMapping("/api/file/onlinePreview")
    public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception{
        fileService.onlinePreview(url,response);
    }

到此這篇關於Java實現辦公文檔在線預覽功能的文章就介紹到這瞭,更多相關Java 文檔在線預覽內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: