openoffice支持在web中整合office操作
openoffice实现原理就是:
将word、excel、ppt、txt等文件转换为pdf文件流;当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,前提就是浏览器支持pdf文件浏览。
我这里介绍通过poi实现word、excel、ppt转pdf流,这样就可以在浏览器上实现预览了

学习

下载安装

https://www.openoffice.org/download/index.html
安装

依赖

项目中添加依赖

  1. <!-- https://mvnrepository.com/artifact/com.artofsolving/jodconverter -->
  2. <dependency>
  3. <groupId>com.artofsolving</groupId>
  4. <artifactId>jodconverter</artifactId>
  5. <version>2.2.1</version>
  6. </dependency>

JODConverter 使用 OpenOffice.org 在不同的办公文档格式之间进行转换

使用该工具将word,excel,ppt进行转为pdf
方便在页面上进行预览

工具类

  1. /** * 文件格式转换工具类 */
  2. public class FileConvertUtil {
  3. /** 默认转换后文件后缀 */
  4. private static final String DEFAULT_SUFFIX = "pdf";
  5. /** openoffice_port */
  6. private static final Integer OPENOFFICE_PORT = 8100;
  7. /** * 方法描述 office文档转换为PDF(处理本地文件) * * @param sourcePath 源文件路径 * @param suffix 源文件后缀 * @return InputStream 转换后文件输入流 */
  8. public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
  9. File inputFile = new File(sourcePath);
  10. InputStream inputStream = new FileInputStream(inputFile);
  11. return covertCommonByStream(inputStream, suffix);
  12. }
  13. /** * 方法描述 office文档转换为PDF(处理网络文件) * * @param netFileUrl 网络文件路径 * @param suffix 文件后缀 * @return InputStream 转换后文件输入流 */
  14. public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
  15. // 创建URL
  16. URL url = new URL(netFileUrl);
  17. // 试图连接并取得返回状态码
  18. URLConnection urlconn = url.openConnection();
  19. urlconn.connect();
  20. HttpURLConnection httpconn = (HttpURLConnection) urlconn;
  21. int httpResult = httpconn.getResponseCode();
  22. if (httpResult == HttpURLConnection.HTTP_OK) {
  23. InputStream inputStream = urlconn.getInputStream();
  24. return covertCommonByStream(inputStream, suffix);
  25. }
  26. return null;
  27. }
  28. /** * 方法描述 将文件以流的形式转换 * * @param inputStream 源文件输入流 * @param suffix 源文件后缀 * @return InputStream 转换后文件输入流 */
  29. public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
  30. ByteArrayOutputStream out = new ByteArrayOutputStream();
  31. OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
  32. connection.connect();
  33. DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
  34. DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
  35. DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
  36. DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
  37. converter.convert(inputStream, sourceFormat, out, targetFormat);
  38. connection.disconnect();
  39. return outputStreamConvertInputStream(out);
  40. }
  41. /** * 方法描述 outputStream转inputStream */
  42. public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
  43. ByteArrayOutputStream baos=(ByteArrayOutputStream) out;
  44. return new ByteArrayInputStream(baos.toByteArray());
  45. }
  46. public static void main(String[] args) throws IOException {
  47. //convertNetFile("http://172.16.10.21/files/home/upload/department/base/201912090541573c6abdf2394d4ae3b7049dcee456d4f7.doc", ".pdf");
  48. //convert("c:/Users/admin/Desktop/2.pdf", "c:/Users/admin/Desktop/3.pdf");
  49. }
  50. }

业务层代码

  1. public void onlinePreview(String url, HttpServletResponse response) throws Exception {
  2. //获取文件类型
  3. String[] str = SmartStringUtil.split(url,"\\.");
  4. if(str.length==0){
  5. throw new Exception("文件格式不正确");
  6. }
  7. String suffix = str[str.length-1];
  8. if(!suffix.equals("txt") && !suffix.equals("doc") && !suffix.equals("docx") && !suffix.equals("xls")
  9. && !suffix.equals("xlsx") && !suffix.equals("ppt") && !suffix.equals("pptx")){
  10. throw new Exception("文件格式不支持预览");
  11. }
  12. InputStream in=FileConvertUtil.convertNetFile(url,suffix);
  13. OutputStream outputStream = response.getOutputStream();
  14. //创建存放文件内容的数组
  15. byte[] buff =new byte[1024];
  16. //所读取的内容使用n来接收
  17. int n;
  18. //当没有读取完时,继续读取,循环
  19. while((n=in.read(buff))!=-1){
  20. //将字节数组的数据全部写入到输出流中
  21. outputStream.write(buff,0,n);
  22. }
  23. //强制将缓存区的数据进行输出
  24. outputStream.flush();
  25. //关流
  26. outputStream.close();
  27. in.close();
  28. }

Controller

  1. @ApiOperation(value = "系统文件在线预览接口")
  2. @PostMapping("/api/file/onlinePreview")
  3. public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception{
  4. fileService.onlinePreview(url,response);
  5. }

附录

OpenOffice安装:https://blog.csdn.net/jxlhljh/article/details/117041944
学习:https://kkfileview.keking.cn/zh-cn/docs/home.html

[

](https://gitlab.com/bonc_gzyd_group/walking-market)