基于isSpring的PPT转换

news/2024/11/22 4:18:18/
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.ppmy.cn/news/1548932.html

相关文章

【Chatgpt】如何通过分层Prompt生成更加细致的图文内容

如何通过分层Prompt生成更加细致的图文内容 利用ChatGPT和类似的生成式AI模型,通过分层Prompt设计可以生成更具层次感和细节的图文内容。分层Prompt的核心在于将需求分解成多层次的指令,从宏观到微观逐步细化,最终形成高质量的内容输出。 一…

【字符串】给定一个字符串 text 和字符串列表 words,返回 words 中每个单词在 text 中的位置(要求最终的位置从小到大进行排序)

# 给定一个字符串 text 返回 words 中每个单词在 text 中的位置 #(要求最终的位置从小到大进行排序)text input("请输入text的内容:")words input("请输入words的内容:")words words.split()result []for…

非同质化代币 (NFTs)

如何创建一个NFT 要创建一个 NFT&#xff0c;你需要&#xff1a; 将图像上传到像 Arweave 这样的 IPFS 网络上。将 JSON 元数据上传到像 Arweave 这样的 IPFS 网络上。调用 Metaplex 创建一个用于该 NFT 的账户。 上传到 Arweave TSPython Press </> button to view…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

C语言 蓝桥杯某例题解决方案(查找完数)

蓝桥杯原题&#xff1a; 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为“完数”。例如6 1 2 3.编程找出1000以内的所有完数。 这个题没有很大的难点&#xff0c;与我们上一个解决的问题“质因数分解”不同&#xff0c;它不需要判断因数是否是质数&#xff0c;因此…

自监督强化学习:好奇心驱动探索(CDE)算法

自监督强化学习&#xff1a;好奇心驱动探索&#xff08;CDE&#xff09;算法 自监督强化学习&#xff08;Self-Supervised Reinforcement Learning&#xff0c;SSL-RL&#xff09;是一类特殊的强化学习方法&#xff0c;其核心思想是让智能体在没有明确外部奖励信号的情况下&am…

淘宝 NPM 镜像源

npm i vant/weapp -S --production npm config set registry https://registry.npmmirror.com 要在淘宝 NPM 镜像站下载项目或依赖&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 设置淘宝 NPM 镜像源 首先&#xff0c;你需要设置淘宝 NPM 镜像源以加速下载。可以通过…