使用NodeJs 实现图片转PPT

发布于:2024-12-22 ⋅ 阅读:(17) ⋅ 点赞:(0)

序言

帮朋友下载网络资源。最后转化为PPT
网页是这样的
在这里插入图片描述

下载图片

需要使用nodejs来下载图片
安装需要的库

npm install axios

执行下面的JS

const fs = require('fs');
const path = require('path');
const axios = require('axios');
const { URL } = require('url');
const readline = require('readline');

// 创建一个函数用于下载单个图片
async function downloadImage(url, saveDir) {
    try {
        // 发起GET请求并设置响应类型为流
        const response = await axios({
            url,
            responseType: 'stream'
        });

        // 解析URL以获取文件名
        const parsedUrl = new URL(url);
        const fileName = path.basename(parsedUrl.pathname) || 'default.png'; // 如果路径为空,则使用默认名称
        const savePath = path.join(saveDir, fileName);

        // 创建目录(如果不存在)
        await fs.promises.mkdir(saveDir, { recursive: true });

        // 管道流到文件系统
        const writer = fs.createWriteStream(savePath);
        response.data.pipe(writer);

        return new Promise((resolve, reject) => {
            writer.on('finish', () => {
                console.log(`Downloaded: ${fileName}`);
                resolve();
            });
            writer.on('error', reject);
        });
    } catch (error) {
        console.error(`Failed to download ${url}. Reason: ${error.message}`);
    }
}

// 创建一个函数用于处理多个URL
async function downloadImagesFromUrls(urls, saveDirectory) {
    for (const url of urls) {
        await downloadImage(url, saveDirectory);
    }
}

// 生成URL列表,特别处理编号小于10的情况
function generateUrls(baseImageUrl, start, end) {
    const urls = [];
    for (let i = start; i <= end; i++) {
        // 编号小于10则不补零,否则补零
        const numberString = i < 10 ? i.toString() : i.toString().padStart(2, '0');
        const newUrl = baseImageUrl.replace(/(\d+)(?=\.jpg$)/, numberString);
        urls.push(newUrl);
    }
    return urls;
}

// 清空文件夹中的内容
async function clearDirectory(directory) {
    if (fs.existsSync(directory)) {
        const files = await fs.promises.readdir(directory);
        for (const file of files) {
            const filePath = path.join(directory, file);
            const stats = await fs.promises.stat(filePath);
            if (stats.isDirectory()) {
                // 递归清除子目录
                await clearDirectory(filePath);
                await fs.promises.rmdir(filePath);
            } else {
                // 删除文件
                await fs.promises.unlink(filePath);
            }
        }
    }
}

// 使用readline创建接口
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

// 提示用户输入信息
function promptUser() {
    return new Promise((resolve) => {
        rl.question('请输入基础URL: ', (baseUrl) => {
            rl.question('请输入开始编号: ', (startNumberStr) => {
                rl.question('请输入结束编号: ', (endNumberStr) => {
                    rl.close(); // 关闭readline接口
                    resolve({ baseUrl, startNumberStr, endNumberStr });
                });
            });
        });
    });
}

// 主程序逻辑
(async function main() {
    try {
        const { baseUrl, startNumberStr, endNumberStr } = await promptUser();
        const startNumber = parseInt(startNumberStr, 10);
        const endNumber = parseInt(endNumberStr, 10);

        if (isNaN(startNumber) || isNaN(endNumber)) {
            console.error('请输入有效的数字作为开始和结束编号.');
            process.exit(1);
        }

        // 设置保存目录
        const saveDirectory = './downloaded_images';

        // 清空保存目录
        console.log("正在清空图片文件夹...");
        await clearDirectory(saveDirectory);
        console.log("图片文件夹已清空.");

        // 生成URL列表
        const imageUrls = generateUrls(baseUrl + "24.jpg", startNumber, endNumber);

        // 开始下载
        await downloadImagesFromUrls(imageUrls, saveDirectory);
        console.log("所有下载已完成.");
    } catch (err) {
        console.error("下载过程中发生错误:", err);
    }
})();

将图片转化为ppt

安装需要的库

npm install officegen sharp

执行js

const fs = require('fs');
const path = require('path');
const officegen = require('officegen');

// 创建一个函数用于获取图片路径列表
async function getImagePaths(dirPath) {
    try {
        const files = await fs.promises.readdir(dirPath);
        return files.filter(file => /\.(jpg|jpeg|png)$/i.test(file))
            .sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))
            .map(file => path.join(dirPath, file));
    } catch (err) {
        console.error("Error reading directory:", err);
        throw err;
    }
}

// 创建一个函数用于生成PPT
async function createPPT(imagePaths, pptFilePath) {
    // 创建一个新的PPT实例
    const pptx = officegen('pptx');
    
    // 遍历图片路径并添加到PPT中
    for (const imagePath of imagePaths) {
        console.log(`Processing image from ${imagePath}`); // 打印图片路径

        // 确认文件存在
        if (!fs.existsSync(imagePath)) {
            console.error(`File does not exist at path: ${imagePath}`);
            continue;
        }

        const slide = pptx.makeNewSlide();
        
        // 读取图片文件为Buffer
        try {
          
            // 添加图片
            slide.addImage(imagePath);
        } catch (err) {
            console.error(`Failed to read or add image from ${imagePath}:`, err);
        }
    }
    
    // 将PPT保存到文件
    let out = fs.createWriteStream(pptFilePath);
    
    out.on('error', function (err) {
        console.log(err);
    });

    out.on('close', function () {
        console.log('PPT 文件已成功创建!');
    });

    try {
        pptx.generate(out);
    } catch (err) {
        console.error('Error generating PPT:', err);
        throw err;
    }
}

// 设置图片目录和输出PPT文件路径
const imagesDirectory = './downloaded_images';
const pptFilePath = './output.pptx';

// 获取图片路径列表并创建PPT
getImagePaths(imagesDirectory)
    .then(imagePaths => createPPT(imagePaths, pptFilePath))
    .catch(err => console.error("An error occurred:", err));

效果

在这里插入图片描述