我尝试通过阅读一些带有图片的文件夹来使用 pptxgenjs 创建一个 powerpoint 联系表。
当我使用图片的直接路径时,ppt 与图片一起导出很好,但是由于图片的大量集合,脚本由于内存而停止。
所以我尝试在base64中将它作为[文档建议] [1]预先添加,但是当生成ppt时,所有幻灯片都有标题,但没有图片,我没有收到任何错误。
const pptxgen = require("pptxgenjs");
const dirTree = require("directory-tree");
const sizeOf = require("image-size");
const fs = require("fs").promises;
const path = require("path");
const appRoot = process.cwd();
let filePath = path.join(appRoot, "../../../Documents/images");
// I LIST ALL PICTURES
const searchFiles = async function () {
const tree = await dirTree(filePath, {
extensions: /\.(jpeg|jpg)$/,
exclude: /HD/,
});
return tree;
};
const enumText = {
text0: {
x: 0.27,
y: 2.65,
w: 3,
h: 0.2,
color: "000000",
},
text1: {
x: 3.5,
y: 2.65,
w: 3,
h: 0.2,
color: "000000",
},
text2: {
x: 6.8,
y: 2.65,
w: 3,
h: 0.2,
color: "000000",
},
text3: {
x: 0.27,
y: 5.26,
w: 3,
h: 0.2,
color: "000000",
},
text4: {
x: 3.5,
y: 5.26,
w: 3,
h: 0.2,
color: "000000",
},
text5: {
x: 6.8,
y: 5.26,
w: 3,
h: 0.2,
color: "000000",
},
};
const enumPic = {
pic0: {
x: 0.27,
y: 0.58,
},
pic1: {
x: 3.5,
y: 0.58,
},
pic2: {
x: 6.8,
y: 0.58,
},
pic3: {
x: 0.27,
y: 3.16,
},
pic4: {
x: 3.5,
y: 3.16,
},
pic5: {
x: 6.8,
y: 3.16,
},
};
let pptx = new pptxgen();
const genSlide = async (picArray, folderName) => {
let slide = await pptx.addSlide();
let textBoxOpts = {
x: 0,
y: 0,
w: "100%",
h: 0.5,
color: "000000",
fontSize: 11,
align: "center",
};
slide.addText(folderName, textBoxOpts);
picArray.forEach(async (pic, i) => {
const textOpt = enumText["text" + i];
const picOpt = enumPic["pic" + i];
const dimensions = sizeOf(pic.path);
const extension = pic.extension.substring(1);
// HERE IS WHERE I PRE-ENCORE THE PICTURE
const base64Pic = await fs.readFile(pic.path, {encoding: "base64"});
// I CREATE THE HEADER
const picture = `data:image/${extension};base64,${base64Pic}`;
slide.addText(pic.name, {...textOpt, fontSize: 7, align: "center"});
// I USE THE PIC
slide.addImage({
data: picture,
...picOpt,
w: dimensions.width,
h: dimensions.height,
sizing: {type: "contain", w: 3, h: 2},
});
});
return slide;
};
const createPres = async function () {
const files = await searchFiles();
files.children.forEach((styleFolder) => {
const folderName = styleFolder.name;
const picArray = [];
styleFolder.children[0].children.forEach((pic) => {
picArray.push(pic);
});
const picturePerSlide = 6;
// Cut pic array in chunks to divide by slides
const result = picArray.reduce((resultArray, item, index) => {
const chunkIndex = Math.floor(index / picturePerSlide);
if (!resultArray[chunkIndex]) {
resultArray[chunkIndex] = []; // start a new chunk
}
resultArray[chunkIndex].push(item);
return resultArray;
}, []);
try {
const slide = result.forEach(async (array) => {
await genSlide(array, folderName);
});
pptx.writeFile(slide);
} catch (error) {
console.log(error);
}
});
};
createPres();
图片文件夹如下
images/
- Folder 1
- SD
- pic.jpeg
- Folder 2
- SD
-pic.jpg
任何想法 ?[1]:https ://gitbrent.github.io/PptxGenJS/docs/api-images