使用NodeJs 实现图片转PPT

序言

帮朋友下载网络资源。最后转化为PPT

网页是这样的

下载图片

需要使用nodejs来下载图片

安装需要的库

cmd 复制代码
npm install axios

执行下面的JS

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

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));

效果

相关推荐
@大迁世界9 分钟前
TypeScript 的本质并非类型,而是信任
开发语言·前端·javascript·typescript·ecmascript
GIS之路17 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug21 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213823 分钟前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中1 小时前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路1 小时前
GDAL 实现矢量合并
前端
hxjhnct1 小时前
React useContext的缺陷
前端·react.js·前端框架
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全