Java使用OpenOffice在线预览Office及PDF

使用OpenOffice可实现在线预览office文件内容

更多精彩

  • 更多技术博客,请移步 asing1elife’s blog

思路

  1. 用 OpenOffice 将 word / excel / ppt 转换为 pdf
  2. 用 pdf.js 将转换后的 pdf 显示在浏览器中显示

准备

  1. 安装 OpenOffice ,参见 OpenOffice 在 Linux 下安装使用
  2. 启动 OpenOffice ,soffice "-accept=socket,host=localhost,port=8100;urp;" -headless -nofirststartwizard &
    • Mac端需要跳转到 Applications/OpenOffice.app/Contents/program 才可启动服务
  3. 下载 JODConverter ,在其 lib 目录中找到 jodconverter-cli-2.2.2.jar ,并引入以下 jar 包
  4. 下载 PDF.js ,并引入到项目中
    • vue项目使用vue.js pdf viewer

在项目 pom.xml 中引入以下包

<dependency>
    <groupId>org.openofficegroupId>
    <artifactId>juhartifactId>
    <version>4.1.2version>
dependency>
<dependency>
    <groupId>org.openofficegroupId>
    <artifactId>jurtartifactId>
    <version>4.1.2version>
dependency>
<dependency>
    <groupId>org.openofficegroupId>
    <artifactId>ridlartifactId>
    <version>4.1.2version>
dependency>
<dependency>
    <groupId>org.openofficegroupId>
    <artifactId>unoilartifactId>
    <version>4.1.2version>
dependency>
<dependency>
    <groupId>org.openofficegroupId>
    <artifactId>jodconverterartifactId>
    <version>2.2.2version>
    <scope>systemscope>
    <systemPath>${basedir}/../lib/jodconverter-2.2.2.jarsystemPath>
dependency>

调用服务并转换文件

  1. 通过 OpenOfficeConnection 调用 OpenOffice 服务,并将传入文件转换为 PDF 格式
public static File fileToPdf(File file) {
    // 文件全路径名
    String fileName = file.getPath();

    // 存放转换结果的 pdf 文件
    File pdfFile = new File(fileName.substring(0, fileName.lastIndexOf(".")) + Constants.REPORT_FILE_PREVIEW_SUFFIX);

    // 非空验证
    if (!file.exists() || !file.isFile()) {
        return null;
    }

    // 存在则不再转换
    if (pdfFile.exists() && pdfFile.isFile()) {
        return pdfFile;
    }

    // 获取连接
    OpenOfficeConnection connection = new SocketOpenOfficeConnection(Constants.OPEN_OFFICE_CONNECTION_PORT);

    try {
        // 建立连接
        connection.connect();

        // 开始转换
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
        converter.convert(file, pdfFile);

        // 关闭连接
        connection.disconnect();
    } catch (ConnectException e) {
        logger.error("PDF 转换失败,OpenOffice 服务未启动!", e);
        throw new TSharkException("PDF 转换失败,OpenOffice 服务未启动!", e);
    }

    return pdfFile;
}

在页面准备显示内容的区域

  1. 页面上通过 iframe 引入 pdf.js 中的 viewer.html 并传入待显示的 pdf 文件