Java
如何用 Java 实现word、excel、ppt、txt等办公文件在线预览功能?
java 实现办公文件在线预览功能是一个在工作中也许会遇到的需求,网上些公司专门提供这样的服务,不过需要收费。
如果想要免费的,可以用 openoffice,实现原理就是:
通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件流;当然如果装了Adobe Reader XI,那把pdf直接拖到浏览器页面就可以直接打开预览,前提就是浏览器支持pdf文件浏览。
这里介绍通过poi实现word、excel、ppt转pdf流,这样就可以在浏览器上实现预览了。
到官网下载 Apache OpenOffice: https://www.openoffice.org/download/ 安装包,安装运行。(不同系统的安装方法不同)
image.png

1、在项目的pom文件中引入依赖

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

2、将word、excel、ppt转换为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. /**
  12. * 文件格式转换工具类
  13. */
  14. public class FileConvertUtil {
  15. /*
  16. * 默认转换后文件后缀
  17. */
  18. private static final String DEFAULT_SUFFIX = "pdf";
  19. /*
  20. * openoffice_port
  21. */
  22. private static final Integer OPENOFFICE_PORT = 8100;
  23. /**
  24. * 方法描述 office文档转换为PDF(处理本地文件) *
  25. * @param sourcePath 源文件路径
  26. * @param suffix 源文件后缀
  27. * @return InputStream 转换后文件输入流
  28. */
  29. public static InputStream convertLocaleFile(String sourcePath, String suffix) throws Exception {
  30. File inputFile = new File(sourcePath);
  31. InputStream inputStream = new FileInputStream(inputFile);
  32. return covertCommonByStream(inputStream, suffix);
  33. }
  34. /**
  35. * 方法描述 office文档转换为PDF(处理网络文件) *
  36. * @param netFileUrl 网络文件路径
  37. * @param suffix 文件后缀
  38. * @return InputStream 转换后文件输入流
  39. */
  40. public static InputStream convertNetFile(String netFileUrl, String suffix) throws Exception {
  41. // 创建URL
  42. URL url = new URL(netFileUrl);
  43. // 试图连接并取得返回状态码
  44. URLConnection urlconn = url.openConnection();
  45. urlconn.connect();
  46. HttpURLConnection httpconn = (HttpURLConnection) urlconn;
  47. int httpResult = httpconn.getResponseCode();
  48. if (httpResult == HttpURLConnection.HTTP_OK) {
  49. InputStream inputStream = urlconn.getInputStream();
  50. return covertCommonByStream(inputStream, suffix);
  51. }
  52. return null;
  53. }
  54. /**
  55. * 方法描述 将文件以流的形式转换 *
  56. * @param inputStream 源文件输入流
  57. * @param suffix 源文件后缀
  58. * @return InputStream 转换后文件输入流
  59. */
  60. public static InputStream covertCommonByStream(InputStream inputStream, String suffix) throws Exception {
  61. ByteArrayOutputStream out = new ByteArrayOutputStream();
  62. OpenOfficeConnection connection = new SocketOpenOfficeConnection(OPENOFFICE_PORT);
  63. connection.connect();
  64. DocumentConverter converter = new StreamOpenOfficeDocumentConverter(connection);
  65. DefaultDocumentFormatRegistry formatReg = new DefaultDocumentFormatRegistry();
  66. DocumentFormat targetFormat = formatReg.getFormatByFileExtension(DEFAULT_SUFFIX);
  67. DocumentFormat sourceFormat = formatReg.getFormatByFileExtension(suffix);
  68. converter.convert(inputStream, sourceFormat, out, targetFormat);
  69. connection.disconnect();
  70. return outputStreamConvertInputStream(out);
  71. }
  72. /**
  73. * 方法描述 outputStream转inputStream
  74. */
  75. public static ByteArrayInputStream outputStreamConvertInputStream(final OutputStream out) throws Exception {
  76. ByteArrayOutputStream baos=(ByteArrayOutputStream) out;
  77. return new ByteArrayInputStream(baos.toByteArray());
  78. }
  79. public static void main(String[] args) throws IOException {
  80. //convertNetFile("http://172.16.10.21/files/home/upload/department/base/201912090541573c6abdf2394d4ae3b7049dcee456d4f7.doc", ".pdf");
  81. //convert("c:/Users/admin/Desktop/2.pdf", "c:/Users/admin/Desktop/3.pdf");
  82. }
  83. }

3、service层在线预览方法代码

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

4、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. }

5、效果展示

Java 实现word、excel、ppt、txt等办公文件在线预览功能 - 图2在线预览execlJava 实现word、excel、ppt、txt等办公文件在线预览功能 - 图3预览word