不得不说jacob这个东西很坑,走了很多弯路,由于依赖windows服务器,自然而然很有可能出现很多不可预测的问题
出现过得问题
1.程序在服务器上跑着,不知怎么的就导致了程序卡在那了,也没有异常抛出。这个问题排查了很久。
解决方案 在异常捕获的时候使用的Exception ,后来换成了捕获Throable。
代码如下:
private File docConvert(String sourcePath, String suffix,FileInfo fileInfo) throws Exception {
boolean wordFlag = suffix.equals("doc") || suffix.equals("docx") || suffix.equals("dot") || suffix.equals("txt") || suffix.equals("wps") || suffix.equals("rtf") || suffix.equals("docm");
boolean pptFlag = suffix.equals("ppt") || suffix.equals("pptx") || suffix.equals("pot") || suffix.equals("pps");
ActiveXComponent app = null;
Dispatch doc = null;
Dispatch docs;
File pdfFile;
try {
logger.info("打开应用程序");
ComThread.InitSTA();
if (wordFlag) {
app = new ActiveXComponent("Word.Application");
docs = app.getProperty("Documents").toDispatch();
app.setProperty("Visible", false);
} else if (pptFlag) {
app = new ActiveXComponent("PowerPoint.Application");
docs = app.getProperty("Presentations").toDispatch();
} else {
throw new FileCovertException("文件格式不支持转换!");
}
//获得word中所有打开的文档,返回Documents对象
//调用Documents对象中Open方法打开文档,并返回打开的文档对象Document
logger.info("打开文档....");
doc = Dispatch.call(docs,
"Open",
sourcePath,
false,
true
).toDispatch();
String pdfPathNoSuffix = fileConfig.selfAdaptionCovertPdfAddr();
StringBuilder pathBuilder = new StringBuilder();
String toPathHaveSuffix = pathBuilder.append(pdfPathNoSuffix).append("\\").append(fileInfo.getFileId()).append(".pdf").toString();
logger.info("转换文档到PDF..." + toPathHaveSuffix);
if (wordFlag) {
Dispatch.call(doc,
"SaveAs",
toPathHaveSuffix,
JacobConstant.WDFORMATPDF
);
} else {
Dispatch.call(doc,
"SaveAs",
toPathHaveSuffix,
JacobConstant.PPSAVEASPDF
);
}
logger.info("文件另存为");
pdfFile = new File(toPathHaveSuffix);
} catch (Throwable e) {
logger.error("jacob转换程序执行失败");
throw new FileCovertException("Error:文档转换失败:",e);
} finally {
//关闭文档 ppt关闭文档需要两个参数,其他两种情况需要三个
if(wordFlag){
Dispatch.call(doc, "Close",false);
}else {
Dispatch.call(doc, "Close");
}
//关闭word应用程序
if (app != null&&wordFlag) {
app.invoke("Quit", new Variant[]{});
}
if(app!=null&&pptFlag){
app.invoke("Quit");
}
logger.info("关闭office程序");
//如果不调用这句话windWord.exe进程将不会关闭
ComThread.Release();
}
return pdfFile;
}
问题2:
当对excel文档进行转换时,如果文档的内容是空文档,不包含空格(有空格不会出现这种情况),当进行转换时会出现如下情况
这种情况直接导致程序卡死,程序不往下进行,(个人理解,当进程多时,由于做的异步处理,很可能造成栈溢出)
所以为了解决这个问题,也是费了不少力,由于excel(个人用的2016)不支持对空文档的转换
所以,只是有了思路,并没有再具体深究
思路如下:
思路1 :使用Excel的窗口事件,通过监听机制捕获这个窗口,并关闭它。
思路2:通过判断文件是否是空文件,如果是空文件可以对文档进行增加空格处理,或者是空文档抛异常,切换其他转化器。
判断文档空白的思路:
通过poi相关技术实现对文档的判断
通过io流判断文件的空(这种方式尝试了一下貌似不是很好,没效果)
整体的问题就差不多这么多,当然在项目中碰到Excel的问题,考虑到性能,我们还是选择了其他转换器。只是有jacob转换Word PPT。
整体就是这样。
有碰到jacob处理excel这个问题的还希望告知一下,一起交流。