SSM使用OpenOffice+Adobe acrobat实现Office文件的在线预览

news2024/11/25 22:37:48

文章迁移自语雀。

也许Java天生不适合处理Office文件吧,POI的使用一堆问题,现在SpringMVC+Spring+Mybatis的web项目想实现在线预览也是问题一大堆。马的,开始时打算使用OpenOffice+SWFTools+FlexPaper的,但是该方案是使用flash的,众所周知,flash明年就要死了,故放弃,后来又想使用pdf2HtmlEx将pdf转成html,这b办法也是一堆坑,摸索了半天,总算有了一个好的解决方案:

OpenOffice将Office文件转换为pdf,存储进服务器硬盘上的固定文件夹,随后将该文件夹在Tomcat中配置虚拟路径,Controller收到预览请求后查找到该虚拟路径返回,浏览器安装了Adobe acrobat之后就可以直接预览了。

Adobe acrobat的好处在哪里呢?在于它不仅支持pdf,对于txt,mp3,png,jpg,mp4等文件均可以直接预览,省去了很多事情。

当然,该方法也有局限,要求用户必须安装Adobe acrobat。

至于更好的办法目前还没有。

首先,给出OpenOffice4.0和jodconverter所需的jar包:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;
import java.net.ConnectException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
 
 
import com.artofsolving.jodconverter.DocumentConverter;  
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;  
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;  
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;  
   
/**
 * Office文件转换工具
 * 将doc,docx,xls,xlsx,pp,pptx转换为pdf
 * @author shuaicenglou
 *
 */
public class DocConverter {
    private String convert(InputStream fromFileInputStream, String toFilePath,String type) throws IOException {
    	Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
        String timesuffix = sdf.format(date);
        String docFileName = null;
        String htmFileName = null;
        if(".doc".equals(type)){
            docFileName = "doc_" + timesuffix + ".doc";
            htmFileName = "doc_" + timesuffix + ".pdf";
        }else if(".docx".equals(type)){
            docFileName = "docx_" + timesuffix + ".docx";
            htmFileName = "docx_" + timesuffix + ".pdf";
        }else if(".xls".equals(type)){
            docFileName = "xls_" + timesuffix + ".xls";
            htmFileName = "xls_" + timesuffix + ".pdf";
        }else if(".ppt".equals(type)){
            docFileName = "ppt_" + timesuffix + ".ppt";
            htmFileName = "ppt_" + timesuffix + ".pdf";
        }else if(".pptx".equals(type)){
            docFileName = "pptx_" + timesuffix + ".pptx";
            htmFileName = "pptx_" + timesuffix + ".pdf";
        }else{
            return null;
        }
        File htmlOutputFile = new File(toFilePath + File.separatorChar + htmFileName);
        File docInputFile = new File(toFilePath + File.separatorChar + docFileName);
        if (htmlOutputFile.exists()) {
        	htmlOutputFile.delete();
        }
        htmlOutputFile.createNewFile();
        if (docInputFile.exists()) {
        	docInputFile.delete();
        }
        docInputFile.createNewFile();
        /**
                            * 由fromFileInputStream构建输入文件
         */
        try {
            OutputStream os = new FileOutputStream(docInputFile);
            int bytesRead = 0;
            byte[] buffer = new byte[1024 * 8];
            while ((bytesRead = fromFileInputStream.read(buffer)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
 
            os.close();
            fromFileInputStream.close();
        } catch (IOException e) {
        }
 
        OpenOfficeConnection connection = new SocketOpenOfficeConnection(8100);
        try {
            connection.connect();
        } catch (ConnectException e) {
            System.err.println("文件转换出错,请检查OpenOffice服务是否启动");
        }
        // convert
        DocumentConverter converter = new OpenOfficeDocumentConverter(connection);
        converter.convert(docInputFile, htmlOutputFile);
        connection.disconnect();
        // 转换完之后删除word文件
        docInputFile.delete();
    	return htmFileName;
    }   
    /**
     * win下手动开启Openoffice服务
     * @param servicePath 服务安装位置
     */
    public static void startOpenOfficeService(String servicePath) {
	   String command = servicePath + "program\\soffice -headless -accept=\"socket,host=127.0.0.1,port=8100;urp;\" -nofirststartwizard";
	   try {
		Process pro = Runtime.getRuntime().exec(command);
	   } catch (IOException e) {
		   System.out.println("OpenOffice服务启动失败");
	   }
   }
    /**
     * win下手动关闭OpenOffice服务
     */
   public static void shutdownOpenOfficeService() {
       try {
	       Process pro = Runtime.getRuntime().exec("tasklist");
	       Scanner in = new Scanner(pro.getInputStream());
	       while(in.hasNext()) {
	    	   String proString = in.nextLine();
	    	   if(proString.contains("soffice.exe")) {
	    		   String cmd = "taskkill /f /im soffice.exe";
	    		   pro = Runtime.getRuntime().exec(cmd);
	    		   System.out.println("soffice.exe关闭");
	    	   }
	    	   if(proString.contains("soffice.bin")) {
	    		   String cmd = "taskkill /f /im soffice.bin";
	    		   pro = Runtime.getRuntime().exec(cmd);
	    		   System.out.println("soffice.bin关闭");
	    	   }
	       }
       } catch (IOException e) {
		e.printStackTrace();
	}
   }
   /**
             *   文件转换
    * @param inputPath 输入路径
    * @param outputPath 文件输出路径,文件名自动生成
    * @return
    */
   public boolean convert(String inputPath,String outputPath) {
	   File file = new File(inputPath);
	   String fileName = file.getName();
	   boolean result = false;
	   //判断文件后缀类型
	   String type = "."+fileName.substring(fileName.lastIndexOf(".") + 1);
	   try {
			FileInputStream fileInputStream = new FileInputStream(file);
			DocConverter d = new DocConverter();
			if(d.convert(fileInputStream, outputPath, type)!=null) {
				result = true;
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} 
	   return result;
   }
    public static void main(String s[]) {
    	new DocConverter().convert("D:\\a.xls", "D:\\");
    }
}  

上面代码生成的pdf存储在Tomcat配置的虚拟路径的文件夹里。

然后,Adobe acrobat自行下载安装即可 

在这里要多说两句:

1.对于带有积分号等数学符号:MathType类型的doc,OpenOffice在转换时会丢失,导致文件不完整 ,这是OpenOffice自身的缺陷,目前无法避免

2.jdoconverter一定要使用2.2.2版本,否则docx,xlsx,pptx会转换失败。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1162653.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

葡萄酒是如何从葡萄园到你的酒杯的?

根据定义,我们称葡萄酒的美味花蜜是葡萄酒精发酵的产物。也有果酒,或乡村酒,是由发酵的水果制成的。然而,传统意义上的葡萄酒是由酿酒葡萄制成的。好吧,一切都是在几个步骤中完成的,来自云仓酒庄品牌雷盛红…

【Linux】进程创建

文章目录 进程创建fork函数初识fork函数返回值写时拷贝fork常规用法fork调用失败的原因 进程创建 fork函数初识 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 include <unistd.h> …

【EI会议征稿】第三届电子信息工程、大数据与计算机技术国际学术会议(EIBDCT 2024)

第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;EIBDCT 2024&#xff09; 2024 3rd International Conference on Electronic Information Engineering, Big Data and Computer Technology 第三届电子信息工程、大数据与计算机技术国际学术会议&#xff08;…

PHP版本升级后,PHPExcel导出下载文件失败,白屏或ERR_INVALID_RESPONSE(网页暂时无法连接,或者它已永久性地移动到了新网址)

PHP版本升级后&#xff0c;PHPExcel导出下载文件失败&#xff0c;白屏或ERR_INVALID_RESPONSE&#xff08;网页暂时无法连接&#xff0c;或者它已永久性地移动到了新网址&#xff09; 这里因为PHP版本过高导致PHPExcel下载失败&#xff1b; 解决方法&#xff1a;打开 PHPExce…

分享一下商城小程序怎么做

随着移动互联网的普及&#xff0c;越来越多的用户开始使用商城小程序进行购物。商城小程序不仅方便快捷&#xff0c;还能享受更多的优惠和福利。本文将探讨如何打造一个成功的商城小程序&#xff0c;并分享一些实用的策略和案例。 了解用户需求是打造商城小程序的第一步。我们需…

利用云计算和微服务架构开发可扩展的同城外卖APP

如今&#xff0c;同城外卖APP已经成为了人们点餐的主要方式之一。然而&#xff0c;要构建一款成功的同城外卖APP&#xff0c;不仅需要满足用户的需求&#xff0c;还需要具备可扩展性&#xff0c;以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…

FastDFS+Nginx搭建本地服务器并实现远程访问

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

2.预备知识-3GPT版

#pic_center R 1 R_1 R1​ R 2 R^2 R2 目录 知识框架No.1 数据操作数据预处理一、N维数组样例二、创建数组三、访问元素四、数据操作D2L注意点五、数据预处理D2L注意点六、QA No.2 线性代数一、标量二、向量1、基本操作2、空间表示3、乘法 三、矩阵1、基本操作2、乘法3、空间表…

uniapp 微信小程ios端键盘弹起后导致页面无法滚动

项目业务逻辑和出现的问题整理 新增页面 用户可以主动添加输入文本框 添加多了就会导致当前页面出现滚动条,这就导致ios端滚动页面的时候去点击输入框键盘抬起再关闭的时候去滚动页面发现页面滚动不了(偶尔出现),经过多次测试发现是键盘抬起的时候 主动向上滑动 100%出现这种问…

[PyTorch][chapter 58][强化学习-2-有模型学习2]

前言&#xff1a; 前面我们讲了一下策略评估的原理,以及例子. 强化学习核心是找到最优的策略&#xff0c;这里 重点讲解两个知识点&#xff1a; 策略改进 策略迭代与值迭代 最后以下面环境E 为例&#xff0c;给出Python 代码 。 目录&#xff1a; 1&#xff1a; 策略改进 2&…

计算协方差

例如&#xff0c;有两组数据&#xff1a; 身高x&#xff08;厘米&#xff09; 体重y&#xff08;公斤&#xff09; 194 87 183 78 175 71 平均 184 78.7 现在要计算x和y的协方差。 手工计算 用excel计算 ​​​​​​​

Security ❀ HTTP协议常见DOS攻击详解

文章目录 1. 协议基础概述2. HTTP协议报文2.1 HTTP Request 请求包2.2 HTTP Response 应答包 3. HTTP GET Flood3.1. 攻击原理3.2. 防护方法 4. HTTP POST Flood4.1. 攻击原理4.2. 防护方法 5. 慢速CC攻击5.1. 攻击原理5.2. 防护方法 6. 总结 1. 协议基础概述 HTTP - HyperTex…

解决Hbulider 按F11不能退出免打扰模式

原因&#xff1a;F11快捷键并不是退出免打扰模式&#xff0c;需要覆盖配置 右侧如下图&#x1f447; [{"key":"ctrlf11","command":"workbench.action.distanceFreeMode"} ]

WheatA 轻量级生态数据软件

无论是在工作还是上学期间&#xff0c;大家想要做一个科研项目或者市场调查时&#xff0c;往往需要大量的数据用于分析总结&#xff0c;这时获得优质的数据就显得额外重要&#xff0c;数据的优劣往往决定了项目结果的好坏。数据来源的主要渠道主要有两种&#xff1a;无非是去数…

CTF-Reverse---VM虚拟机逆向[HGAME 2023 week4]vm题目复现【详解】

文章目录 前言0x1[HGAME 2023 week4]vm提取汇编指令mov指令push指令&pop指令运算操作cmp指令jmp指令je 和 jne exp 前言 没有前言。终于搞定第二题了。费劲是真的费。 题目在nssctf上有。 这一题写完才看到有提示&#xff0c;是关于构建结构体的&#xff0c;下次试试。 0x…

LiveNVR监控流媒体平台局域网Onvif/RTSP/SDK等方式接入监控视频后转GB28181/GB35114级联输出,上级平台无法播放如何抓包分析

1、第一步&#xff1a;抓包工具准备 1.1、Linux 使用 tcpdump 进行抓包&#xff0c;如果系统无此命令&#xff0c;自行安装 1.2、windows 下载安装 wireshark 进行抓包 2、第二步&#xff1a;找到上级平台ip 在基础配置里面GB28181级联配置中SIP服务IP 3、第三步&#…

重新理解B面供应链:在轻创业的潮流里

中国新式供应链正在成型。 在这个由于年轻的消费需求驱动的想法、AI大模型能力、严苛清晰的供应链、工厂图谱一共构成的链条上&#xff0c;越来越多的新创业和新产业模型都正在被加速成型&#xff0c;并真实转化为新的工业生产力。 作者|史圣园 编辑|皮爷 出品|产业家 …

Android 控件背景实现发光效果

主要实现的那种光晕效果&#xff1a;中间亮&#xff0c;四周逐渐变淡的。 这边有三种发光效果&#xff0c;先上效果图。 第一种、圆形发光体 实现代码&#xff1a;新建shape_light.xml&#xff0c;导入以下代码。使用时&#xff0c;直接给view设置为background。 <?xml …

IT开发怕失败?买个低代码搭建属于自己应用

目录 一、驱动低代码流行的主要几个特性 01、低代码缩短了开发时间 02、低代码允许平滑协作 03、低代码在云端和本地都可运行 二、低代码究竟好不好用 三、源码全交付的开发平台 01、高性能、高拓展 02、功能丰富&#xff0c;满足通用场景 03、私有化部署 04、部署方式 05、多数…

PFMEA详解结构分析——Sun FMEA软件

FMEA从1949年诞生到今天已经发生过多次更新&#xff0c;最新版本是2019年6月发布的《AIAG VDA FMEA手册》。新手册借鉴了AIAG的方框图、参数图、流程图等工具的运用&#xff0c;也借鉴了VDA的五步过程导向法&#xff0c;并在此基础上头尾各增加一步&#xff0c;形成了FMEA七步法…