const fs = require('fs')const JSZip = require('jszip')const xml2js = require('xml2js')function extractTextFromPPTX(pptxFilePath) { return new Promise((resolve, reject) => { fs.readFile(pptxFilePath, (err, data) => { if (err) { reject(err) return } const zip = new JSZip() zip .loadAsync(data) .then((zipContent) => { const slideData = [] // 新增一个数组, 用于存储每个幻灯片的信息 // 遍历 zip 文件中的所有文件 return Promise.all( Object.keys(zipContent.files).map((fileName, index) => { // 查找 .xml 文件,这些文件包含幻灯片的文本内容 if (fileName.endsWith('.xml')) { return zipContent.files[fileName] .async('string') .then((xmlContent) => { return parseXmlSlideContent(xmlContent, slideData, index) }) } }) ).then(() => { resolve(slideData) }) }) .catch((err) => { reject(err) }) }) })}function parseXmlSlideContent(xmlContent, slideData, index) { return new Promise((resolve, reject) => { xml2js.parseString(xmlContent, (err, result) => { if (err) { reject(err) return } // 从 XML 结构中提取文本内容和元数据 const slideInfo = extractTextAndMetadataFromXmlStructure(result, xmlContent) slideData.push(slideInfo) // 将每个幻灯片的信息添加到 slideData 数组中 resolve(slideInfo) }) })}function extractTextAndMetadataFromXmlStructure(xml, index) { let text = '' let slideType = 'user' // 默认为用户创建的幻灯片 // 从 XML 根节点开始遍历 const slides = xml['p:sld'] if (slides) { const slide = slides['p:cSld'][0] const slideIndex = parseInt(slide['$']?.name?.split('Slide ')[1]) || 1 // 提取页码信息 // 检查是否为系统生成的幻灯片 if (slide.hasOwnProperty('p:spTree') && slide['p:spTree'][0]['p:sp'].some(sp => sp['p:nvSpPr'][0]['p:nvPr'][0]['a:extLst'])) { slideType = 'system' } const shapes = slide['p:spTree'][0]['p:sp'] if (shapes) { shapes.forEach((shape) => { // 检查是否为文本框 if (shape.hasOwnProperty('p:txBody')) { const paragraphs = shape['p:txBody'][0]['a:p'] if (paragraphs) { paragraphs.forEach((paragraph) => { // 提取文本 const runs = paragraph['a:r'] if (runs) { runs.forEach((run) => { text += run['a:t'].toString() }) text += '\n' } }) } } }) } // 返回一个包含文本和元数据的对象 return { text: text.trim(), slideIndex: slideIndex, slideType: slideType, } } return { text: '', slideIndex: 0, slideType: 'unknown' }}// 使用示例extractTextFromPPTX('/asddd/dddd/ssss/123.pptx').then((res) => { console.log(res)})
nodejs读取pptx文件内每一页文本框内容, 搜了一下市面上的插件, 只有生成, 没有读取.. 这里只提供一个思路, 其他功能可自行拓展