java调用jacob进行文件转换ppt转pdf或者png

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值为32
            Dispatch.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();
    }

相关推荐
程序员黑豆3 小时前
Java包装类:基本类型与对象的桥梁
java·前端·ai编程
mldong7 小时前
"applicant" 契约:退回发起人的闭环设计
java·架构
月华路7 小时前
G1 垃圾回收:脏卡队列、记忆集与并发精化线程机制
java·开发语言
gugucoding8 小时前
47. 【Java】Java内存模型(JMM)与可见性
java·开发语言
zww89491118 小时前
校园跑腿系统开发实战指南:从需求分析到上线部署全流程解析
java
Fluxart.ai9 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
名字还没想好☜9 小时前
Java 线上内存泄漏排查实战:jmap 导堆、MAT 找 GC Roots 与四类常见泄漏
java·开发语言·jvm·内存泄漏
IT爱学堂11 小时前
尚硅谷 - 2025年3月Java+AI大模型应用开发
java·开发语言·人工智能
小贤plus12 小时前
SpringBoot 三大核心注解精讲:@ControllerAdvice、@RestControllerAdvice、@Validated 分组校验(实战)
java
吠品12 小时前
Java byte数组与String互转:编码细节与踩坑记录
java·linux·服务器