最近一直在忙安卓的事情,感觉博客就要荒废掉了一样。

趁着有一点点空的时间把之前的一些idea都记录下来。

这个idea来源于PPT的浏览和打印。

有些PPT非常的“直男设计”,配色异常奇葩。

好比说黄色字白色底,黑色底棕色字,灰常不利于阅读。

那怎么办呢?第一时间想到的就是在Powerpoint上批量换色。

但是问题来了,Powerpoint似乎是没有选择全部“对象”的功能的。

上百页的PPT,这么多的文本框,怎么搞啊。

这时我就想到了 .pptx 是一个Zip压缩文件,用XML描述一个PPT。

讲道理,
可以对PPT里面的每一页里面的颜色的节点做一个字符串的替换,
这样就可以实现批量换色了。

那就动手吧~

基础装备

你需要一个压缩和解压 Zip 的工具,我选择 BandiZip

你还需要一个脚本语言,我选择无敌的 Node.js

当然,最关键的是需要一个Powerpoint,至少也要2007以后的吧。

开始动手

保存 .pptx

首先,我们需要把PPT另存为为 .pptx 格式的,
因为 .ppt 不是用 XML 描述一个PPT的。

如果本来就是 .pptx 那就无视上面那一步。

确认要替换的颜色的RGB值

第二,我们确认一下需要替换的颜色和替换到什么颜色。

这个需要我们在Powerpoint中选中有目标颜色的文本,
在“字体颜色”那儿选择“其他颜色”,
弹出的框框选自定义就可以看到颜色的RGB值了。

在这里颜色是红绿蓝的RGB的十进制数。
所以你会看到类似“红色 255 绿色 128 蓝色 0”这样的东西。

但是我们得转化成十六进制的RGB颜色值呀~

所以下面我提供了一个小函数方便大家转换(用控制台即可使用):

1
2
3
4
5
6
function toRGBCode(r, g, b){
return `#${pad(r)}${pad(g)}${pad(b)}`;
function pad(num) {
return (Array(2).join("0") + num.toString(16)).slice(-2);
}
}

直接调用 toRGBCode 这个函数,分别传入红色、蓝色、绿色的值即可。

如:toRGBCode(255, 0, 0) 会输出 "#ff0000"

提取每一页的XML

使用解压工具把你要搞的 XXXX.pptx 解压了,
找到 ppt/slides 这个文件夹,
把整个文件夹解压出来,
这个就是每一页的PPT的 XML文件。

解压完毕之后,请看一下最后一个文件的需要是多少。

好比说,slide27.xml 是序号最大的文件,就说明这个PPT有 27 页。

好啦,记下来多少页之后就可以上脚本了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const fs = require('fs');

const start = 1; // 开始的页码
const end = 44; // 需要替换颜色的最大页码

const path = './slides/'; // Slide的XML文件夹位置
run(path, start, end);

function run(path, start, end) {
for(let i = start; i <= end; i++) {
worker(path, i);
}

console.info('ok!');
}

function worker(path, page) {
let data = fs.readFileSync(`${path}slide${page}.xml`).toString();
data = replaceColor(data, 'FF0000', '000000'); // 替换红色为黑色
data = replaceColor(data, 'FFFF00', '000000'); // 替换黄色为黑色
fs.writeFileSync(`${path}slide${page}.xml`, data);
}

function replaceColor(data, srcColor, targetColor) {
return data.replace(
new RegExp(`<a:srgbClr val="${srcColor.toUpperCase()}"/>`, 'g'),
`<a:srgbClr val="${targetColor.toUpperCase()}"/>`
)
}

记得看一下脚本的注释,把该修改的地方都给改了。

好比说页码、Slides文件夹路径、需要替换的颜色和目标颜色,一定一定要改!!

脚本保存后运行一下就可以啦~

打包回去

还是用 BandiZip,我们把刚刚处理完的Slides文件夹整个压缩回去。

BandiZip 打开 .pptx文件后,用“添加”功能就可以啦~

Ok! 赶紧打开 Powerpoint 看一下效果吧!

除非注明,麦麦小家文章均为原创,转载请以链接形式标明本文地址。

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)

本文地址:https://blog.micblo.com/2017/11/14/%E6%89%B9%E9%87%8F%E6%9B%BF%E6%8D%A2PPT%E4%B8%AD%E7%9A%84%E9%A2%9C%E8%89%B2/