使用OpenOffice可实现在线预览office文件内容
更多精彩
- 更多技术博客,请移步 asing1elife’s blog
思路
- 用 OpenOffice 将 word / excel / ppt 转换为 pdf
- 用 pdf.js 将转换后的 pdf 显示在浏览器中显示
准备
- 安装 OpenOffice ,参见 OpenOffice 在 Linux 下安装使用
- 启动 OpenOffice ,
soffice "-accept=socket,host=localhost,port=8100;urp;" -headless -nofirststartwizard &
- Mac端需要跳转到
Applications/OpenOffice.app/Contents/program
才可启动服务
- Mac端需要跳转到
- 下载 JODConverter ,在其 lib 目录中找到 jodconverter-cli-2.2.2.jar ,并引入以下 jar 包
- 下载 PDF.js ,并引入到项目中
- vue项目使用vue.js pdf viewer
在项目 pom.xml 中引入以下包
<dependency><groupId>org.openoffice</groupId><artifactId>juh</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.openoffice</groupId><artifactId>jurt</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.openoffice</groupId><artifactId>ridl</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.openoffice</groupId><artifactId>unoil</artifactId><version>4.1.2</version>
</dependency>
<dependency><groupId>org.openoffice</groupId><artifactId>jodconverter</artifactId><version>2.2.2</version><scope>system</scope><systemPath>${basedir}/../lib/jodconverter-2.2.2.jar</systemPath>
</dependency>
调用服务并转换文件
- 通过 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;
}
在页面准备显示内容的区域
- 页面上通过 iframe 引入 pdf.js 中的 viewer.html 并传入待显示的 pdf 文件
<iframe src="${ctx}/assets/plugins/pdf/web/viewer.html?file=<c:url value="/api/report/intro/preview/file/${fileNamePrefix}/${fileNameSuffix}"/>" width="100%" height="100%" frameborder="0" scrolling="hidden">
</iframe>
后端返回待显示的文件流
- 后端将待显示的 pdf 文件通过 ResponseEntity 传入到前端
public ResponseEntity<byte[]> preview(String fileName) throws IOException {// 获取文件File file = new File(Constants.REPORT_SOURCE_FILE_PATH + fileName);// 转换并返回结果byte[] pdfFileBytes = FileUtils.readFileToByteArray(OnlinePreviewUtil.fileToPdf(file));HttpHeaders httpHeaders = new HttpHeaders();httpHeaders.setContentType(MediaType.valueOf("application/pdf"));httpHeaders.setContentLength(pdfFileBytes.length);httpHeaders.add(HttpHeaders.ACCEPT_RANGES, "bytes");return new ResponseEntity<byte[]>(pdfFileBytes, httpHeaders, HttpStatus.OK);
}