0

我尝试通过阅读一些带有图片的文件夹来使用 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

4

0 回答 0