nodejs读取pptx文件内每一页文本框内容

228 阅读1分钟
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文件内每一页文本框内容, 搜了一下市面上的插件, 只有生成, 没有读取.. 这里只提供一个思路, 其他功能可自行拓展