ppt转pdf的java实现

news2024/9/16 8:45:01

一、实现方式

java采用jacob包的功能,把ppt演示文稿转换为pdf。

支持文件格式:pptx,ppt

二、事先准备

1、依赖于office,需安装office办公软件

2、需要下载一个jacob-1.20-x64.dll的文件,放到java的bin目录下。

文件可以网上搜索下载。也可以点击百度网盘下载链接:

https://pan.baidu.com/s/16y-N03KPQJkne6g4sMLAmg?pwd=ix4j

三、Java转换代码

1、maven包依赖:

        <dependency>
            <groupId>com.jacob</groupId>
            <artifactId>jacob</artifactId>
            <version>1.20</version>
        </dependency>

2、java转换类:JacobUtil.java

主要看ppt2PDF方法。

package com.lan.fts.util;

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *  excel word ppt转pdf
 *  未完全完善
 * @author LAN
 * @date 2021年07月01日
 */
public class JacobUtil {

    private static Logger log = LoggerFactory.getLogger(JacobUtil.class);
    private static final Integer WORD_TO_PDF_OPERAND = 17;
    private static final Integer PPT_TO_PDF_OPERAND = 32;
    private static final Integer EXCEL_TO_PDF_OPERAND = 0;

    public static void word2PDF(String inputFile, String pdfFile) {
        ComThread.InitSTA();
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        try {
            app.setProperty("Visible", false);
            Dispatch docs = app.getProperty("Documents").toDispatch();

            Dispatch doc = Dispatch.call(docs, "Open", new Object[]{inputFile, false, true}).toDispatch();
            Dispatch.call(doc, "ExportAsFixedFormat", new Object[]{pdfFile, WORD_TO_PDF_OPERAND});
            Dispatch.call(doc, "Close", new Object[]{false});
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("转换出错:" + pdfFile);
        } finally {
            app.invoke("Quit");
            ComThread.Release();
        }
    }

    public static void excel2PDF(String inputFile, String pdfFile) {
        ComThread.InitSTA(true);
        ActiveXComponent app = new ActiveXComponent("Excel.Application");
        try {
            app.setProperty("Visible", false);
            app.setProperty("AutomationSecurity", new Variant(3));// 禁用宏
            Dispatch excels = app.getProperty("Workbooks").toDispatch();
            Object[] param1 = new Object[]{inputFile, new Variant(false), new Variant(false)};
            Dispatch excel = Dispatch.invoke(excels, "Open", Dispatch.Method, param1, new int[9]).toDispatch();
            //转换
            Object[] param2 = new Object[]{
                    new Variant(EXCEL_TO_PDF_OPERAND), // PDF格式=0
                    pdfFile,
                    new Variant(0)  //0=标准 (生成的PDF图片不会变模糊) ; 1=最小文件
            };
            Dispatch.invoke(excel, "ExportAsFixedFormat", Dispatch.Method, param2, new int[1]);
            //关闭
            Dispatch.call(excel, "Close", new Object[]{false});
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("转换出错:" + pdfFile);
        } finally {
            app.invoke("Quit");
            ComThread.Release();
        }
    }

    private static ActiveXComponent ppt_app = new ActiveXComponent("PowerPoint.Application");
    public static void ppt2PDF(String inputFile, String pdfFile) {
      //  ComThread.InitSTA();
        Dispatch ppts = ppt_app.getProperty("Presentations").toDispatch();
        try {
            /**
             * call
             * param 4: ReadOnly
             * param 5: Untitled指定文件是否有标题
             * param 6: WithWindow指定文件是否可见
             * */
            Dispatch ppt = Dispatch.call(ppts, "Open", new Object[]{inputFile, true, true, false}).toDispatch();
            Dispatch.call(ppt, "SaveAs", new Object[]{pdfFile, PPT_TO_PDF_OPERAND});
            //关闭
            Dispatch.call(ppt, "Close");
        } catch (Exception e) {
            log.error("转换出错:" + inputFile, e);
            try{
                ppt_app.invoke("Quit");
            }catch (Exception e1){
                log.error("ppt_app.invoke(\"Quit\")关闭出错!",e);
            }finally{
                ppt_app = new ActiveXComponent("PowerPoint.Application");
            }
        } finally {
      //      ppt_app.invoke("Quit");
      //      ComThread.Release();
        }
    }
}

四、运行测试

    public static void main(String[] args) {
        JacobUtil.ppt2PDF("D:\\data\\out\\lanhezhong文件转换.pptx", "D:\\data\\out\\lanhezhong文件转换.pptx.pdf");
    }

运行结果:

总结:ppt转pdf转换的结果比较好,基本上保持ppt的原本内容格式。

***********************************************************************************************
author:蓝何忠
email:lanhezhong@163.com
***********************************************************************************************

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

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

相关文章

day10-集合

day10 集合 1.集合概述 1.1为什么要用集合&#xff1f; 当我们在实现购物车功能时&#xff0c;可能需要随时添加新商品对象进来&#xff08;个数不确定&#xff09; &#xff0c;也随时可能删除商品对象&#xff0c;这个时候之前学习的数组不满足我们的需求 1.2 什么是集合&…

职称论文的AIGC检测

和高校毕业论文一样&#xff0c;职称论文也是需要通过AIGC检测系统&#xff08;www.checkaigc.com&#xff09;&#xff0c;并且也是有一定的要求的。AIGC检测是因为近年来越来越多人开始使用AI写作工具代写论文&#xff0c;为了防止论文中出现过高的AI论文生成内容&#xff0c…

triton编译学习

一 流程 Triton-MLIR: 从DSL到PTX - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/671434808Superjomns blog | OpenAI/Triton MLIR 迁移工作简介https://superjom

品味Fendi club:精酿啤酒的精致与与众不同

啤酒&#xff0c;作为世界三大饮料之一&#xff0c;其口感和品质的差异能给人们带来截然不同的体验。在众多啤酒中&#xff0c;Fendi club以其与众不同的精酿啤酒风格&#xff0c;吸引了无数热爱啤酒的人。 Fendi club啤酒的精致与与众不同&#xff0c;首先体现在其酿造工艺上。…

pyqt显示指定文件夹的所有文件

pyqt显示指定文件夹的所有文件 目的效果代码 目的 选择文件夹后&#xff0c;显示该文件夹的所有文件。 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QListView, QFileDialog,QWidget from PyQt5.QtCore import…

【目标检测论文解读复现NO.37】基于改进的 YOLOv8 变电设备红外图像检测

前言 此前出了目标改进算法专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Vellum for Mac v3.7.2激活版:一键创建,轻松出版

还在为繁琐的电子书制作流程而烦恼吗&#xff1f;Vellum for Mac&#xff0c;让您的电子书创作变得轻松简单&#xff01;支持多种格式导入&#xff0c;自动构建书籍内容&#xff0c;无需担心排版和格式问题。丰富的编辑和排版功能&#xff0c;让您的书籍更加精美。一键导出多种…

element 输入框禁止输入空格以及复制的值进去删除空格(vue自定义指令)开箱即用

实例图&#xff1a; 代码&#xff1a; //输入框禁止输入空格 Vue.directive(noSpace, {bind(el) {//禁止输入空格el.addEventListener("keydown", function (event) {if (event.keyCode 32) {event.preventDefault();}});//复制值时去掉空格el.addEventListener(&q…

MATLAB函数fir1的C语言移值

要移值的matlab函数&#xff1a; h3 fir1(16,[0.25 0.50]); C语言版本 #include <iostream> #include <cmath>#define PI acos(-1)double sincEasy(double *x, int len, int index) {double temp PI * x[index];if (temp 0) {return 1.0; // sinc(0) 1}ret…

十四、Redis Cluster集群

Redis Cluster是Redis提供的一个分布式解决方案&#xff0c;在3.0推出。Redis Cluster可以自动将数据分片分布到不同的master节点上&#xff0c;同时提供了高可用的支持&#xff0c;当某个master节点挂了之后&#xff0c;整个集群还是可以正常工作。1、为什么要用Redis Cluster…

Spring底层入门(十一)

1、条件装配 在上一篇中&#xff0c;我们介绍了Spring&#xff0c;Spring MVC常见类的自动装配&#xff0c;在源码中可见许多以Conditional...开头的注解&#xff1a; Conditional 注解是Spring 框架提供的一种条件化装配的机制&#xff0c;它可以根据特定的条件来控制 Bean 的…

stm32f103c8t6之4x4矩阵按键

基于普中精灵开发板 1、矩阵按键原理 当我们需要使用较多的按键时&#xff0c;单片机的IO口可能不够用,这是就需要使用矩阵按键。 对应IO口如下&#xff1a; 步骤解析&#xff1a; 1、全部按键都没有按下时&#xff0c;全行IO为低电平&#xff08;全列对应的IO设置为下拉低…

1060: 无向图的最大度计算

解法&#xff1a; #include<iostream> #include<vector> using namespace std; int arr[100][100]; int main() {int n, max 0;cin >> n;vector<int> sum(n, 0);for (int i 0; i < n; i) {for (int j 0; j < n; j) {cin >> arr[i][j];…

Nginx(简洁版)

基本配置 worker_processes 1; //默认为1&#xff0c;表示开启一个业务进程 events //事件驱动模块&#xff08;&#xff09;{worker_connections 1024; //单个业务进程可接受连接数 } http{include mime.types; // 引入http mime类型&#xff08;在外部已经定义好&#xff0c…

数据链路层(详细版)【02】

接 数据链路层&#xff08;详细版&#xff09;【01】 文章目录 四、以太网MAC层&#xff08;一&#xff09;MAC地址组成&#xff08;1&#xff09;48位MAC地址格式&#xff08;2&#xff09;单播地址 & 多播地址 & 广播地址&#xff08;3&#xff09;全球管理 & 本…

ctfshow web271--web273

web271 laravel5.7反序列化漏洞 define(LARAVEL_START, microtime(true));/* |-------------------------------------------------------------------------- | Register The Auto Loader |-------------------------------------------------------------------------- | |…

OFDM802.11a的FPGA实现(十三)加窗(含verilog和matlab代码)

原文链接&#xff08;相关文章合集&#xff09;&#xff1a;OFDM 802.11a的xilinx FPGA实现 1.前言 添加循环前缀后,对数据还要进行加窗(Windowing)操作。加窗操作可以使OFDM 符号在带宽之外的功率谱密度下降得更快。 2.加窗 对OFDM符号“加窗”意味着令符号周期边缘的幅度…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

RAG讲解

现有的LLM已经具备了理解、生成、逻辑和记忆能力&#xff0c;RAG(Retrieval Augmented Generation)则是为其套上外挂&#xff0c;使LLM能够访问训练数据来源之外的权威知识库&#xff0c;并生成领域特定的内容&#xff0c;而无须重新训练模型。 RAG的优势 经济高效&#xff1a…

【简单介绍下Sass】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…