序言
帮朋友下载网络资源。最后转化为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));