如何从 Web 应用程序中上传的 .pptx 文件中提取文本?

问题描述 投票:0回答:1

我目前正在开发一个网络应用程序,用户可以在其中上传 .pptx 文件,并且我需要从后端上传的文件中提取所有文本。我已经实现了前端部分,用户可以在其中输入他们的 .pptx 文件,但我正在努力解决如何在后端处理和提取该文件中的文本。

简化的前端标记:

<div id="uploadBox">
    <form id="uploadForm">
        <div id="dragText">Drag & Drop your file here</div>
        <div id="orText">or</div>
        <div class="input-group" id="selectButton">
            <input
                accept=".pdf, .pptx"
                type="file"
                id="input"
                name="file"
                on:change={() => {
                    const fileInput = document.getElementById("input");
                    const selectedFile = fileInput.files[0];
                }}
            />
            <label for="input">Select file from your device</label>
        </div>
        <div id="fileNameDisplay"></div>
        <button id="submitButton" type="submit" style="display: none;">Begin</button>
    </form>
</div>

前端代码,将pptx文件转成base64File后发送到后端

        const fileArrayBuffer = await file.arrayBuffer();
        const base64File = arrayBufferToBase64(fileArrayBuffer);

        const response = await fetch(`${apiUrl}/api/getTextChunks`, {
          method: 'POST',
          headers: {
            Authorization: `Bearer ${localStorage.getItem('token')}`,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ 
            file: base64File, 
            fileType: fileType === "application/pdf" ? 'pdf' : 'pptx'
          }),
        });

但是,我不知道如何从发送到后端的 base64 文件中获取文本(我使用的是 Node.js 后端)。

我尝试了这个(代码不起作用,但逻辑有意义):

import pdfjs from "pdfjs-dist-legacy";
import count from 'openai-gpt-token-counter';
import path from 'path';

pdfjs.GlobalWorkerOptions.workerSrc = path.join(process.cwd(), '/server/node_modules/pdfjs-dist-legacy/pdf.worker.js');

async function getTextFromPPTX(pptxBuffer) {
    let powerpointText = '';
    const textChunks = [];
  
    console.log('PPTX object:', PPTX);

    let ppt;
    try {
        ppt = new PPTX.Composer();
    } catch (e) {
        console.error('Error while creating new PPTX:', e);
        return;
    }
  
    await ppt.load(pptxBuffer);
  
    const slides = ppt.getSlides();
  
    slides.forEach((slide) => {
      const shapes = slide.getShapes();
  
      shapes.forEach((shape) => {
        if (shape.textBody && shape.textBody.paragraphs) {
          shape.textBody.paragraphs.forEach((paragraph) => {
            paragraph.runs.forEach((run) => {
              const text = run.text;
              powerpointText = text;
            });
          });
        }
      });
    });
  
    return powerpointText;
  }

export default getTextFromPPTX;

我应该如何处理这个问题?

node.js file base64 powerpoint office-js
1个回答
0
投票
  1. 导入jszip和xmldom。
  2. 从 PPTX 文件中获取 PPTX 缓冲区。
  3. 将 PPTX 文件加载为 ZIP 存档。
  4. 定义用于访问 PowerPoint 幻灯片中文本节点的 XML 命名空间。
  5. 创建一个变量 text,以累积提取的文本。
  6. 遍历每张幻灯片,解析其 XML,提取文本,并将其连接到文本。
  7. 返回连接的文本。
import JSZip from 'jszip';
import { DOMParser } from 'xmldom';

function getTextFromNodes(node, tagName, namespaceURI) {
  let text = '';
  const textNodes = node.getElementsByTagNameNS(namespaceURI, tagName);
  for (let i = 0; i < textNodes.length; i++) {
    text += textNodes[i].textContent + ' ';
  }
  return text.trim();
}

async function getTextFromPPTX(arrayBuffer) {
  try {
    const zip = new JSZip();
    await zip.loadAsync(arrayBuffer);

    const aNamespace = "http://schemas.openxmlformats.org/drawingml/2006/main";
    let text = '';
    
    let slideIndex = 1;
    while (true) {
      const slideFile = zip.file(`ppt/slides/slide${slideIndex}.xml`);
      
      if (!slideFile) break;
      
      const slideXmlStr = await slideFile.async('text');
      
      const parser = new DOMParser();
      const xmlDoc = parser.parseFromString(slideXmlStr, 'application/xml');
      
      text += getTextFromNodes(xmlDoc, "t", aNamespace) + ' ';
      
      slideIndex++;
    }

    return text.trim();
  } catch (err) {
    console.error('Error extracting text from PPTX:', err);
    return '';
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.