关于JAVA实现在线预览功能总结

SpringBoot写了一个小Demo,百度网盘地址:https://pan.baidu.com/s/1dS9M89GLR4AIVwJx4aMglg

一、写在线预览功能之前的准备:

1.安装openOffice软件,下载地址:http://www.openoffice.org/download/index.html

2.jdconverter 的jar包  pom依赖如下

<dependency>
   <groupId>org.jodconverter</groupId>
   <artifactId>jodconverter-core</artifactId>
   <version>4.0.0-RELEASE</version>
</dependency>

二、效果图

三、核心代码

 

package com.example.util;
import org.jodconverter.OfficeDocumentConverter;
import org.jodconverter.office.DefaultOfficeManagerBuilder;
import org.jodconverter.office.OfficeException;
import org.jodconverter.office.OfficeManager;

import java.io.File;
import java.util.regex.Pattern;

/**
 * Created by lenovo12 on 2018/8/18.
 * doc docx ex.. ex..x ppt pptx
 */
public final class Office2PDF {
    private Office2PDF(){}

    private static OfficeManager singleOfficeManager = null;
    /**
     * 将office格式的文件转为pdf
     * @param sourceFilePath 源文件路径
     * @return
     */
    public static File openOfficeToPDF(String sourceFilePath){
        return office2pdf(sourceFilePath);
    }

    /**
     * 将office文档转换为pdf文档
     * @param sourceFilePath 原文件路径
     * @return
     */
    public static File office2pdf(String sourceFilePath){
        OfficeManager officeManager = null;
        try{
            if(StringUtil.isEmpty(sourceFilePath))
            {
                //打印日志...
                return null;
            }
            File sourceFile = new File(sourceFilePath);
            if(!sourceFile.exists())
            {
                //打印日志...
                return null;
            }

            String after_convert_file_path = getAfterConverFilePath(sourceFilePath);
            //启动openOffice
            officeManager = getOfficeManager();
            OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager);
            return convertFile(sourceFile,after_convert_file_path,sourceFilePath,converter);
        }catch (Exception e){
            e.printStackTrace();
            System.out.println("转换异常");
        }finally {
           if(officeManager != null){
               try {
                   officeManager.stop();
               } catch (OfficeException e) {
                   e.printStackTrace();
               }
           }
        }
        return null;
    }

    /**
     * 转换文件
     * @param sourceFile 原文件
     * @param after_convert_file_path 转换后存放位置
     * @param sourceFilePath 原文件路径
     * @param converter 转换器
     * @return
     */
    public static File convertFile(File sourceFile,
                           String after_convert_file_path,String sourceFilePath,OfficeDocumentConverter converter) throws OfficeException {
        File outputFile = new File(after_convert_file_path);
        if(!outputFile.getParentFile().exists()){
            //如果上级目录不存在也就是E:/pdfFile这个文件夹不存在则创建一个
            outputFile.getParentFile().mkdirs();
        }
            converter.convert(sourceFile,outputFile);
        return outputFile;
    }

    public static OfficeManager getOfficeManager(){
        if(singleOfficeManager == null)
        {
            DefaultOfficeManagerBuilder builder = new DefaultOfficeManagerBuilder();

            builder.setOfficeHome(getOfficeHome());
            OfficeManager officeManager = builder.build();
            try {
                officeManager.start();
                singleOfficeManager = officeManager;
            } catch (OfficeException e) {
                //打印日志
                System.out.println("start openOffice Fail!");
                e.printStackTrace();
            }
            return singleOfficeManager;
        }
        else
        {
            return singleOfficeManager;
        }
    }

    /**
     * 获取转换后文件存放的路径
     * @param sourceFilePath 源文件
     * @return
     */
    public static String getAfterConverFilePath(String sourceFilePath){
        //截取源文件文件名
        String sourceFileName = sourceFilePath.substring(sourceFilePath.lastIndexOf("/") + 1);
        return "E:/pdfFile/" + sourceFileName.replaceAll("\\."+FileUtil.getFileSuffix(sourceFileName),".pdf");
    }

    /**
     * 获取openOffice的安装目录
     * @return
     */
    public static String getOfficeHome(){
        String osName = System.getProperty("os.name");
        if(Pattern.matches("Windows.*",osName))
        {
            return "C:/Program Files (x86)/OpenOffice 4";
        }
        else if(Pattern.matches("Linux.*",osName))
        {
            return "/usr/temp";
        }
        else if (Pattern.matches("Mac.*",osName))
        {
            return "/Application/openOfficeSoft";
        }
        return null;
    }
}

四、踩过的坑

如果把代码整合放到SSM项目中去,小数点后面的数据将直接被忽略,也就是访问/read/java.doc,理想情况是接收到了fileName这个参数为 "java.doc",结果Debug发现fileName 是"java" ,后面的.doc不见了。解决方案就是在@RequestMapping的value中使用SpEL来表示,value中的{fileName}换成{fileName:.+}。

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值