做网站的盈利点,api软件,北京网站建设是什么,湖南常德通报1例复阳病例java调用jacob进行文件转换ppt转pdf或者png
前情提要
最近项目上#xff0c;遇到一个复杂的ppt#xff0c;最终要求是要将ppt每一页转成图片原本这个是不难#xff0c;网上一搜一大堆案例#xff0c;外加我本身也比较精通aspose#xff0c;那还不是分分钟搞定。结果就是…java调用jacob进行文件转换ppt转pdf或者png
前情提要
最近项目上遇到一个复杂的ppt最终要求是要将ppt每一页转成图片原本这个是不难网上一搜一大堆案例外加我本身也比较精通aspose那还不是分分钟搞定。结果就是客户的那个ppt非常的恶心应该是excel生成的柱状图嵌在ppt中导致无论我使用各种方式转换都会发生缺字少图的情况所以万般无奈之下选择使用最原始的jacob调用office或者wps组件来进行转换这玩意的原理就是jacob调用windwos的com组件调用的就是注册表中的office或者wps的组件这种方式的好处是速度快转出来和原来的图基本一致比较容易符合客户需求。缺点就是依赖原本服务器上office或者wps然后也基本只能使用windows做服务器转换整个过程都是不可知的而且也不受jvm管控
核心方法类
public static void testPPT() {String source D:\\test\\test.pptx;String target D:\\test\\test.pdf;long start System.currentTimeMillis();ActiveXComponent app null;Dispatch ppt null;try {File targetFile new File(target);if (targetFile.exists()) {targetFile.delete();}ComThread.InitSTA();app new ActiveXComponent(Powerpoint.Application);Dispatch ppts app.getProperty(Presentations).toDispatch();/** call* param 4: ReadOnly* param 5: Untitled指定文件是否有标题* param 6: WithWindow指定文件是否可见* */System.out.println(打开文档 source);ppt Dispatch.call(ppts, Open, source, true, true, false).toDispatch();System.out.println(正在转换为PDF target);// 转换pdf值为32Dispatch.call(ppt, SaveAs, target, 32); // 转换png值为18, 这里的target需要输入文件夹// Dispatch.call(ppt, SaveAs, D:\\test\\test, 18); long end System.currentTimeMillis();System.out.println(转换完成用时 (end - start) ms.);} catch (Exception e) {e.printStackTrace();} finally {if (ppt ! null) {Dispatch.call(ppt, Close);}if (app ! null) {app.invoke(Quit);}ComThread.Release();}}注意事项
我遇到的情况是就算是wps或者office把复杂的ppt转换为pdf还是不一定和原来抱持一样但是直接转换为PNG图片基本可以确保和你直接打开ppt效果一致但是坑爹的点在于转换PNG的方式它是会生成一个文件夹然后里面是幻灯片1.PNG这种格式所以得再改名来符合需求这个就很简单了网上都是。还有一点就是 new ActiveXComponent(Powerpoint.Application) 这个Powerpoint.Application可以在电脑的注册表上找到
所以当这一行报错时看看电脑是否装了wps或者office
另一个需要注意的点
//当文件占用无法删除时wps没有影响依旧能调用SaveAs方法但是office则会报错这是我这次发现的区别需要注意
File targetFile new File(target);
if (targetFile.exists()) {targetFile.delete();
}