用Jacob实现预览PPT/Word/Excel文件

此方案已上线使用超过半年了,运行良好。因为使用wps转pdf,所以预览看到的和wps打开看到的完全一样。有个问题是必须部署在windows服务器上。因为转换需要时间,建议将转换后pdf保存起来,下次预览时只需要直接打开此文件。

预览的效果

image.png


预览原理

把office文件转为pdf文件,然后再用pdf.js插件预览pdf文件。

软件环境

WPS:最新版(所以服务器必须为windows。原理:通过wps把office文件转成pdf,安装微软的office也可以)

jacob1.19:下载地址 https://udomain.dl.sourceforge.net/project/jacob-project/jacob-project/1.19/jacob-1.19.zip

pdf.js:最新版

必要操作

需要把jacob-1.19-x64.dll文件放到jre/bin目录下。如下图,tomcat启动时会打印出Java Home目录,放到这个目录的bin目录下即可。

image.png

参考代码

这里只随便贴一段,具体用法可自行搜索,网上有一大把。

	/**
	 * excel转pdf
	 */
	public String wordToPDF(String src) {
		ActiveXComponent app = null;
		Dispatch doc = null;
		try {
			app = new ActiveXComponent("Word.Application");
			app.setProperty("Visible", new Variant(false));
			app.setProperty("AutomationSecurity", new Variant(3));
			Dispatch docs = app.getProperty("Documents").toDispatch();
			doc = Dispatch.call(docs, "Open", new Object[] { src, Boolean.FALSE, Boolean.TRUE }).toDispatch();
			String target = getTarget(src);
			Dispatch.call(doc, "SaveAs", new Object[] { target, Integer.valueOf(17) });
			return target;
		} finally {
			if (doc != null) {
				try {
					Dispatch.call(doc, "Close", new Object[] { Boolean.FALSE });
				} catch (Throwable t) {
					t.printStackTrace();
				}
			}
			if (app != null) {
				try {
					app.invoke("Quit");
					app.safeRelease();
				} catch (Throwable t) {
					t.printStackTrace();
				}
			}
		}
	}

错误解决

异常:om.jacob.com.ComFailException: Can't get object clsid from progid

解决方案:在服务-->tomcat-->登录:配置登录身份。如下图:

image.png


异常:运行一段时间后,突然无法预览附件了,系统无明确报错信息。

解决方案:结束掉wps进程再重新启动wps后,竟然解决问题了。

评论区

opal

2020-12-01 12:45

下个aspose.word,跨平台,不用安装任何office软件

vk567

2020-12-01 13:38

windows jacob 调用微软office 容易导致office奔溃,弹出小窗,必须登录以后点一下确定才可以。后面我们就放弃jacob调用office。使用了跨平台的office软件:LibreOffice,和一它的一个工具包。

云云

2020-12-01 14:36

@vk567 LibreOffice转PDF能完美转换吗?有没有格式错乱问题?

云云

2020-12-01 14:42

刚在WPS官网发现有Linux版本了。大家有用过的吗?

vk567

2020-12-01 18:51

@云云 可以拿LibreOffice 另存为pdf测一下效果是一致的。我在linux删用过wps桌面版 linux的wps和 windows的wps差不多,你可以测试一下用wps替代LibreOffice。

yao136

2020-12-08 08:44

我这试过 windows office,还得下SaveAsPDFandXPS;wps试过不错,以前好好的,突然一天报错了“com.jacob.com.comfailexception” 囧。