当前位置:   article > 正文

Java实现office办公文档在线预览(word、excel、ppt、txt等)_java实现文件预览编辑功能

java实现文件预览编辑功能


office办公文档,如doc、docx、xls、xlsx、ppt、pptx是无法直接在浏览器中打开的,但很多OA办公软件都要求office文档能直接在线预览功能,解决方法如下:

1、office文档转为html,使用POI将文档转为html文件,直接浏览器打开预览

优点:简单,方便不需要安装其他插件

缺点:对拓展名为docx、xlsx、pptx格式文档,最终转换输出的格式样式会出错,影响客户阅读,对于客户需求度不高的可以使用该方法处理

2、office文档转为pdf,使用POI和fr.opensagres.xdocreport将文档转为pdf文件,让浏览器内置pdf阅读器浏览

优点:简单,方便不需要安装其他插件

缺点:doc、xls、ppt输出格式问题不是很大,docx、xlsx、pptx格式文档输出样式错误,并且会出现文字丢失等情况,影响客户阅读

  fr.opensagres.xdocreport 依赖地址:

  1. <dependency>
  2. <groupId>fr.opensagres.xdocreport</groupId>
  3. <artifactId>org.apache.poi.xwpf.converter.pdf</artifactId>
  4. <version>1.0.6</version>
  5. </dependency>

3、office文档转为pdf,使用Apache提供的openOffice将文件转为pdf文件;保证文档格式、文件转换输出稳定,满足在线预览条件。推荐

优点:免费,完美解决转换格式出错问题

缺点:需要下载安装第三方工具openOffice

本地电脑如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,前提就是浏览器要支持pdf文件浏览。

这篇博客主要介绍第三种方法,通过poi实现word、excel、ppt转pdf流,这样就可以在浏览器上实现预览了。


一、官网下载openOffice 安装包,运行安装(不同系统的安装请自行百度,这里不做过多描述)

去官网下载:点击去官网下载

 二、pom中引入依赖

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

 三、office文件转为pdf流的工具类

  1. import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry;
  2. import com.artofsolving.jodconverter.DocumentConverter;
  3. import com.artofsolving.jodconverter.DocumentFormat;
  4. import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
  5. import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
  6. import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter;
  7. import java.io.*;
  8. import java.net.HttpURLConnection;
  9. import java.net.URL;
  10. import java.net.URLConnection;
  11. import java.nio.file.Files;
  12. /**
  13. * 文件格式转换工具类
  14. */
  15. public class FileConvertUtil {
  16. /**
  17. * 默认转换后文件后缀
  18. */
  19. private static final String DEFAULT_SUFFIX = "pdf";
  20. /**
  21. * 端口
  22. */
  23. private static final Integer OPENOFFICE_PORT = 8100;
  24. /**
  25. * office文档转换为PDF(处理本地文件)
  26. *
  27. * @param sourcePath 源文件路径
  28. * @param suffix 源文件后缀
  29. * @return InputStream 转换后文件输入流
  30. */
  31. public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
  32. File inputFile = new File(sourcePath);
  33. InputStream inputStream = Files.newInputStream(inputFile.toPath());
  34. return covertCommonByStream(inputStream, suffix);
  35. }
  36. /**
  37. * office文档转换为PDF(处理网络文件)
  38. *
  39. * @param netFileUrl 网络文件路径
  40. * @param suffix 文件后缀
  41. * @return InputStream 转换后文件输入流
  42. */
  43. public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
  44. // 创建URL
  45. URL url = new URL(netFileUrl);
  46. // 试图连接并取得返回状态码
  47. URLConnection urlConnection = url.openConnection();
  48. urlConnection.connect();
  49. HttpURLConnection httpUrlConnection = (HttpURLConnection) urlConnection;
  50. int httpResult = httpUrlConnection.getResponseCode();
  51. if (httpResult == HttpURLConnection.HTTP_OK) {
  52. InputStream inputStream = urlConnection.getInputStream();
  53. return covertCommonByStream(inputStream, suffix);
  54. }
  55. return null;
  56. }
  57. /**
  58. * 将文件以流的形式转换
  59. *
  60. * @param inputStream 源文件输入流
  61. * @param suffix 源文件后缀
  62. * @return InputStream 转换后文件输入流
  63. */
  64. public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
  65. ByteArrayOutputStream out = new ByteArrayOutputStream();
  66. OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
  67. connection.connect();
  68. DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
  69. DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
  70. DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
  71. DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
  72. converter.convert(inputStream, sourceFormat, out, targetFormat);
  73. connection.disconnect();
  74. return outputStreamConvertInputStream(out);
  75. }
  76. /**
  77. * outputStream转inputStream
  78. */
  79. public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
  80. ByteArrayOutputStream outputStream = (ByteArrayOutputStream) out;
  81. return new ByteArrayInputStream(outputStream.toByteArray());
  82. }
  83. }

四、service层代码 

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

五、controller层代码

  1. @PostMapping("/file/onlinePreview")
  2. public void onlinePreview(@RequestParam("url") String url, HttpServletResponse response) throws Exception{
  3. fileService.onlinePreview(url,response);
  4. }

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/428592
推荐阅读
相关标签
  

闽ICP备14008679号