基于isSpring的PPT转换

alt

背景

PPT课件目前还是一项在教学中高度频繁使用的工具,对于在线教学就更为重要了。如何把PPT转换为在线web,同时保留更多的PPT特性(动画、音效、视频)呢?这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一困境。

通过官网,我们可以看到它有iSpring Suite和iSpring CodeBuilder ,这两者有什么区别呢?前者主要用于PowerPoint插件,会以tab的形式显示在PowerPoint中,后者是一个开发工具,允许开发人员使用 iSpring API 进行二次开发。它提供了编程接口,开发者可以利用它来集成和定制 iSpring 内容,或者将内容嵌入到自定义的 LMS 或其他系统中。

环境准备

ispring本身是一个exe程序,执行安装后即可使用。本身是付费的,有需要Pojieban用以学习研究的可以联系我。

依赖环境

  • Windows 64 位环境
  • 系统已安装 Office(2013 版本或更高,其它版本未验证)

安装

  1. 运行工程目录 ispring 目录下的 ispring_platform_ultimate_x64_8_3_0.msi 安装包安装转换 SDK。

pojie大法

  1. 安装完成后使用 ispring 目录下的 iSpringSDK.dll 文件替换掉 SDK 安装安装目录下的同名文件。SDK 安装目录默认在 C:\Program Files\iSpring\Platform Ultimate 8\PPT Conversion SDK

  2. 打开 ispring SDK 编辑器,编辑器文件目录默认为 C:\Program Files\iSpring\Platform Ultimate 8\PPT Conversion SDK\CodeBuilder\CodeBuilder.exe,在编辑器最后一个 Tab Activation 中输入工程目录中 ispring/key.txt 中的 key 进行激活即可。

  3. 将工程目录 ispring/players 文件目录拷贝覆盖到 SDK 安装目录 players 下,默认为 C:\Program Files\iSpring\Platform Ultimate 8\PPT Conversion SDK\players

常规使用

找到安装目录下的CodeBuilder.exe(win10环境默认路径为C:\Program Files\iSpring\Platform Ultimate 8\PPT Conversion SDK\CodeBuilder\CodeBuilder.exe),选择对应ppt文件进行转化,OutputOptions选HTML5,

alt
alt

miscellaneous settings→javascript api 这个两个勾要选上,否则无法和webview进行交互,教师端没法进行切页。

另外,如果文件做了修改,那需要重新选择sourceFile,不然转出来的还是上一个文件。

自动化转换

除了通过界面使用之外,还提供了几种调用方式C#、VB.NET、CMD。为了做好自动化,我们可以通过nodejs调用cmd的方式实现。

alt
iSpringSDK.exe c -fs --skin none "C:\Users\admin\Desktop\新建 Microsoft PowerPoint 演示文稿 (2).pptx" "C:\Users\admin\Desktop\PowerPoint 演示文稿\新建 Microsoft PowerPoint 演示文稿 (2).html" 

因此,我们可以把会变的部分做成变量,实现自动化转换

const fs = require('fs');
const { exec } = require('child_process');
const archiver = require('archiver');
const axios = require('axios');
const path = require('path');

// 配置文件路径和上传 URL
const pptFilePath = 'path/to/your.pptx';
const outputPdfPath = 'output/your.html';
const zipFilePath = 'output/your.zip';
const uploadUrl = 'https://your-upload-server.com/upload';

// 1. 将 PPT 转换为 PDF
function convertPptToPdf() {
    return new Promise((resolve, reject) => {
        const command = `iSpringSDK.exe c -fs --skin none ${pptFilePath} ${outputPdfPath} `;
        exec(command, (error, stdout, stderr) => {
            if (error) {
                console.error(`转换失败: ${error.message}`);
                return reject(error);
            }
            console.log('PPT 转换成功');
            resolve(outputPdfPath);
        });
    });
}

// 2. 压缩文件
function zipFile(filePath) {
    return new Promise((resolve, reject) => {
        const output = fs.createWriteStream(zipFilePath);
        const archive = archiver('zip', { zlib: { level: 9 } });

        output.on('close', () => {
            console.log(`文件已压缩: ${archive.pointer()} bytes`);
            resolve(zipFilePath);
        });

        archive.on('error', (err) => reject(err));

        archive.pipe(output);
        archive.file(filePath, { name: path.basename(filePath) });
        archive.finalize();
    });
}

// 3. 上传文件
function uploadFile(filePath) {
    const fileStream = fs.createReadStream(filePath);
    const formData = new FormData();
    formData.append('file', fileStream);

    return axios.post(uploadUrl, formData, {
        headers: formData.getHeaders()
    })
    .then(response => {
        console.log('上传成功:', response.data);
        return response.data;
    })
    .catch(error => {
        console.error('上传失败:', error);
        throw error;
    });
}

// 主函数:执行转换、压缩、并上传
async function main() {
    try {
        // 转换 PPT 到 PDF
        await convertPptToPdf();

        // 压缩 PDF
        await zipFile(outputPdfPath);

        // 上传 ZIP
        await uploadFile(zipFilePath);
    } catch (error) {
        console.error('流程中出现错误:', error);
    }
}

main();

业务落地

PPT转换之后,我们就得到了一个如下所示的html页面

alt

配置相关的数据已经被压缩到这个加密的字符串里了

alt

data下可以看到PPT所使用的字体文件、图片、音视频等,以及每个ppt页的样式和代码

alt

那我们就可以把它应用到业务中了。可以通过在线的显示或者离线包的方式加载。

如果是做直播场景,可能会遇到需要用代码控制PPT跳转的情况。这时候,我们需要增加获取player实例的代码,如下所示:

(function(player)
{
 function findConnector(win)
 {
  var retries = 0;
  while (!win.ispringPresentationConnector && win.parent && win.parent != win)
  {
   ++retries;
   if (retries > 7)
   {
    return null;
   }

   win = win.parent;
  }
  return win.ispringPresentationConnector;
 }

 function getConnector()
 {
  var api = findConnector(window);
  if (!api && window.opener && (typeof(window.opener) != "undefined"))
  {
   api = findConnector(window.opener);
  }
  return api;
 }

 var connector = getConnector();
 if (connector)
 {
  connector.register(player);
 }
})(player);

拿到player实例,可以获取playbackController对象控制PPT的跳转了。

let $playbackController = player.view().playbackController() // 生成ppt实例化对象

// 当前页
const currentSlideIndex = $playbackController.clock().timestamp().slideIndex()

// 当前状态
const state = $playbackController.playbackState()
console.info('ppt状态:', { state, slideIndex: currentSlideIndex })

// 特定跳转
// slideIndex: 数字类型,幻灯片索引 stepIndex: 数字类型,动画步骤索引 timeOffset:数字类型, 从目标动画步骤开始的时间偏移,以秒为单位,默认需要传递0 autoPlay:布尔类型,是否自动播放动画,默认需要传递true
$playbackController.gotoTimestamp(slideIndex, stepIndex, timeOffset, autoPlay)

// 下一页
$playbackController.gotoNextSlide(autoPlay)

// 上一页
$playbackController.gotoPreviousSlide(autoPlay)

// 播放动画
$playbackController.play()

// 暂停动画
$playbackController.pause()

// 跳转特定页码
$playbackController.gotoSlide(slideIndex)

// 事件监听
 this.$slideChangeEventInstance = this.$playbackController.slideChangeEvent()
this.$slideChangeEventInstance.addHandler(this.onSlideChangeEvent)

this.$stepChangeEventInstance = this.$playbackController.stepChangeEvent()
this.$stepChangeEventInstance.addHandler(this.onStepChangeEvent)

this.$stateChangeEventInstance = this.$playbackController.clock().stateChangeEvent()
this.$stateChangeEventInstance.addHandler(this.onClockStateChangeEvent)

iSpring支持自定义播放器样式,如果默认的样式不满足业务,可以定制样式。

在真实的落地场景中,我们也遇到了一些坑:

  • wps制作的文件,可能会出现黑屏或者转出来文件特别大的情况
  • 安卓、ios下第一次打开,部分机型会出现一个播放按钮,需要点击一下才可以开始使用
  • 不分机型对于音视频的播放存在不播放的情况
  • 文件过大,容易出现视频丢失

总结

作为一个PPT转换功能,能还原到这个程度,实属不易了。虽然有一些坑,但整体使用效果还是不错的,新版本的坑会少一些,建议使用新版本。

本文由 mdnice 多平台发布

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

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

相关文章

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况,Linux Shell提供了一组测试运算符。 通过这些运算符,Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句,例如判断语句和循环语句中…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代,人工智能(AI)技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式,还极大地丰富了消费者的购物体验。随着技术的不断进步,AI在电商领域的应用越来越广泛,从个性…

【Linux】环境变量

目录 一、什么是环境变量: 1、系统命令搜索路径(PATH): 2、HOME: 3、SHELL: 4、添加环境变量: 二、通过代码获取环境变量: 三、主函数参数: argc表: envp表&…

28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

密码算法简介 1.对称加密算法:加密和解密算法一样 2.非对称加密算法:公钥加密、私钥解密 3.摘要算法:不能解密,不可逆 简单介绍了解一下: 一、对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法…

如何用GPT-4o解读视频

OpenAI在去年推出的GPT-4V已经支持了多模态识别,但一直仅限于图片输入,不支持视频。相比之下,Google的Gemini早已支持视频识别。最近,我司业务场景中出现了一个需要识别视频的需求,而我们只采购了GPT-4o模型。这就引发…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理: 1.BPDU版本号识别:运行MSTP/RSTP协议的交换机会根据收到的BPDU(Bridge Protocol Data Unit,桥协议数据单元)版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…

vim配置 --> 在创建的普通用户下

在目录/etc/ 下面,有个名为vimrc 的文件,这是系统中公共的vim配置文件对所有用户都有效 我们现在创建一个普通用户 dm 创建好以后,我们退出重新链接 再切换到普通用户下 再输入密码(是不显示的,输入完后,…

Vue通过file控件上传文件到Node服务器

功能: 多文件同步上传、拖动上传、实时上传进度条、上传前的删除文件、原生file控件的美化 搁置的功能: 取消上传(上传过程中取消,即取消网络请求abort)、上传文件夹、大文件切片、以及很多限制条件未处理(重复上传、文件格式。。。) bug: 文件总大小(。。。竟然从d…

VScode学习前端-01

小问题合集: vscode按!有时候没反应,有时候出来,是因为------>必须在英文状态下输入! 把鼠标放在函数、变量等上面,会自动弹出提示,但挡住视线,有点不习惯。 打开file->pre…

Qwen2.5-3B-Instruct-GGUF部署

注册账号: 魔搭社区 等一会: 部署好了: 立即使用: 您部署的服务提供OpenAI API接口,可通过OpenAI SDK进行调用。请确保您的服务处于正常运行状态,并预先安装OpenAI SDK: pip install openai 在本地新建…

数据库管理-第262期 崖山:知其不可而为之(20241116)

数据库管理262期 2024-11-16 数据库管理-第262期 崖山:知其不可而为之(20241116)1 崖山之名2 绝地反击3 不止崖山总结 数据库管理-第262期 崖山:知其不可而为之(20241116) 作者:胖头鱼的鱼缸&am…

C语言:指针的变量运算及数组指针

1、指针的变量运算 指针变量保存的是地址&#xff0c;二地址本质上是一个整数&#xff0c;所以指针变量可以进行部分运算&#xff0c;列如加法减法、比较等&#xff0c;请看下面的代码&#xff1a; 1. #include <stdio.h> 2. 3. int main(){ 4. int a 10, *pa &a…

【高德地图】基本使用教程(玩转地图)(vue2+vue3)

简介 带大家一步步实现地图显示特定位置&#xff0c;或定位到当前位置。并且拖拽地图界面能够查询出指定位置周边的信息。通过关键字搜索周边信息。 本教程适合初学者。 一、获取使用高德api的key 打开高德开发平台&#xff0c;登录后&#xff0c;鼠标覆盖右上角头像&#…

统信UOS开发接口DTK

DTK(Development ToolKit)是基于 Qt 开发的简单且实用的通用开发框架。提供丰富的开发接口与支持工具,能有效提升开发效率。 文章目录 一、简介DTK 常见模块介绍概述二、框架创建开发环境准备使用 cmake三、常见模块窗口和对话框一、简介 DTK 常见模块介绍 概述 DTK(Dev…

转轮数组(C语言实现)

题目介绍 方法一我们可以先把数字1 2 3 4逆转一下&#xff0c;第二步我们可以逆转一下5 6 7&#xff0c; 最后整体逆置一下就会变成上面的数字。 void reverse(int* nums, int begin, int end) {while (begin < end){int tmp nums[begin];nums[begin] nums[end];nums[en…

云端弹性计算公式有哪些内容?

云端弹性计算公式有哪些内容&#xff1f;云端弹性计算公式涵盖资源分配、性能监控、自动伸缩及积分计算等方面。资源分配依据虚拟机配置和实际需求动态调整&#xff1b;性能监控实时监控CPU、内存等关键指标&#xff1b;自动伸缩根据预设阈值自动调整虚拟机数量&#xff1b;积分…

openGauss常见问题与故障处理(四)

4.数据库故障定位手段&#xff1a; 数据库故障定位手段通常有如下三种类&#xff1a; 提到“种类”&#xff0c;这里给大家举一个模拟场景中肖荏盖反向的小故事 对于初学者入门的学习&#xff0c;一些理论不容易理解或记住&#xff0c;所以本节课程【创新】采用了【正、反对比…

《Structure-from-Motion Revisited》论文解析——COLMAP

一、论文简介 这篇论文的标题是《Structure-from-Motion Revisited》&#xff0c;作者是Johannes L. Schnberger和Jan-Michael Frahm&#xff0c;分别来自北卡罗来纳大学教堂山分校和苏黎世联邦理工学院。这篇论文主要讨论了一种新的增量式结构从运动&#xff08;Structure-fro…