Java文件在线预览,doc文档转换pdf,使用pdf.js + jodconverter + libreoffice(openOffice衍生版)

本文只实现了doc文档转换至Pdf文档,力求简单粗暴,so代码有很多需改进地方,故只做记录,方便日后查询

关于pdf转swf需要另外下载SWFTools软件,这个功能后续有时间再更新

使用到的技术pdf.js + jodconverter + libreoffice(openOffice衍生版)

  • 导入java包

<!-- jodconverter 文件转换  2.2.2版本已可转换-->
<dependency>
    <groupId>com.artofsolving</groupId>
    <artifactId>jodconverter</artifactId>
    <version>2.2.2</version>
</dependency>

 

<!-- 新版本,有空可测试  -->

<!-- https://mvnrepository.com/artifact/org.jodconverter/jodconverter-core -->

<dependency>

    <groupId>org.jodconverter</groupId>

    <artifactId>jodconverter-core</artifactId>

    <version>4.1.0</version>

</dependency>

 

  • 安装libreoffice软件

下载地址:https://zh-cn.libreoffice.org/

 

安装成功后,可使用命令启动服务

命令:

  cd C:\Program Files\LibreOffice\program   //进入我的安装目录

soffice.exe -headless -accept="socket,host=127.0.0.1,port=8100;urp;" -nofirststartwizard &   //启动服务

  netstat -ano|findstr "8100"   //查看端口8100的监听情况,就是看有没启动

 

当然也可使用任务管理器查看服务开启状态(另一个是不是bin不太记得了,如有错误烦请指出):

 

三、编写文件转换工具类(没有SWFTools软件不要转换swf格式)

import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

//文件转换工具
public class FileConvertUtil {
    private String docPath;       //   doc文档所在路径
    private String outputPath;;// 输入路径 ,转换好的文件放到什么路径
    private File pdfFile;
    private File docFile;

    // docPath:doc文档所在路径,filename:pdf和swf文件名,outputPath:转换后文件所在路径
    public FileConvertUtil(String docpath,String filename,String outputpath) {
        //初始化
        this.docPath = docPath;
        this.outputPath=outputpath;
        docFile = new File(docpath);  //新建doc文档
        pdfFile = new File(outputPath+"\\"+filename+".pdf");  //以doc文档
    }

    //转为PDF
    public void docConvertToPdf() throws Exception {
        if (!docFile.exists()) {
            System.out.println("****swf转换器异常,需要转换的文档不存在,无法转换****");
            return;
        }
        if (pdfFile.exists()) {
            System.out.println("****已经转换为pdf,不需要再进行转化****");
            return;
        }
        //java启动LibreOffice,节省内存
//        String command ="C:\\Program Files\\LibreOffice\\program\\soffice.bin -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard &";
//        Process pro = Runtime.getRuntime().exec(command);
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
        try {
            connection.connect();
            DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
            converter.convert(docFile, pdfFile);
            // close the connection 关闭连接
            connection.disconnect();
            System.out.println("****pdf转换成功,PDF输出:" + pdfFile.getPath()+ "****");
        } catch (java.net.ConnectException e) {
            e.printStackTrace();
            System.out.println("****swf转换器异常,openoffice服务未启动!****");
            throw e;
        } catch (com.artofsolving.jodconverter.openoffice.connection.OpenOfficeException e) {
            e.printStackTrace();
            System.out.println("****swf转换器异常,读取转换文件失败****");
            throw e;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
        //java关闭LibreOffice,节省内存
//        finally {
//            // 关闭OpenOffice服务的进程
//            pro.destroy();
//        }
    }

}

上面代码中注释了一段代码,只用法是为了节省内存,就是每次转换文件之前开启服务,转换之后关闭服务,

四、控制器调用(Controller)

@RequestMapping("/fileview/{id}")//
public String FileOnLineView(@PathVariable("id")Integer id,HttpServletRequest request,HttpServletResponse response){

Resource r = service.findOne(id);

String filepath = "D:\\IDEA\\MyCSDN\\src\\main\\webapp\\";//doc文档路径
//实例化工具类
FileConvertUtil fileConvertUtil = new FileConvertUtil(filepath + "files\\" + r.getFileName(), r.getTitle(), filepath + "pdf");

try {
                fileConvertUtil.docConvertToPdf();
                File pdf = fileConvertUtil.getPdfFile();
                FileInputStream fileInputStream = new FileInputStream(pdf);
                response.reset();
//            response.setHeader("Content-Disposition", "attachment;fileName=test.pdf");
//            response.setContentType("multipart/form-data");
                OutputStream outputStream = response.getOutputStream();
                IOUtils.write(IOUtils.toByteArray(fileInputStream), outputStream);
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }

}

五、页面使用pdf.js预览

  • 0
    点赞
  • 0
    评论
  • 2
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

衍95

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值