
领导让我做 PPT,我用代码来生成
假设有一天,你需要整理一份中国所有大学信息的 ppt。
大学的信息是能搜到的,但是一份份整理到 ppt 里也太麻烦了。
能不能用代码自动生成 PPT呢?
自然是可以的。
这里大学的信息可以从中国大学 MOOC这里抓取:


我们用 puppeteer 来爬取大学的校徽、名字、介绍,然后用这些信息来生成 pdf 等。
创建个 Nest 项目:
安装 puppeteer:
然后在 AppService 里引入下:
这里用 puppeteer 抓取中国大学 mooc 的学校列表的信息。
headless 指定 true,不用看界面了。
然后简单在内存做了下 cache,没用 redis。
在 AppController 里加个路由:
把服务跑起来:

试一下:

然后继续点进详情页,拿到学校的描述:


抓取每个学校数据的时间太长,我们用 SSE(server sent event) 的方式返回数据:
SSE 类似这样用:

改下 AppController
还有 AppService

主要是返回一个 rxjs 的 Observable 然后不断用 observer.next 返回数据。
试一下:

SSE 和爬虫简直是绝配!
接下来生成 ppt,用 pptxgenjs 这个包。
用法很简单:


new 一个实例,添加一个 Slide,然后添加 text image 等内容,最后写入文件。
我们先测试下:
新建 test.js
分别指定文字和图片的 x、y,对齐方式 align。
跑一下:

打开看一下:

没问题。
然后我们在 list 接口里加一下这个:
顺便替换下校徽图片,之前取的这个:

换成这里的:


跑一下:

跑完之后可以看到,动态生成了 400 多张 ppt:

案例代码上传了 github:https://github.com/QuarkGluonPlasma/nestjs-course-code/tree/main/ppt-generate
总结
我们使用 puppeteer 抓取了大学的信息,用 SSE 的方式创建了接口,不断返回爬取到的数据。
然后用 pptxgenjs 来生成了 ppt。
这样,400 多张 PPT 瞬间就生成了,不用自己手动搞。
#前端#