You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在构造函数外部获取其内部生成的PDF文本?

解决pdfreader无法在构造函数外部获取PDF文本的问题

我明白你的困扰——你现在能在pdfreader的解析回调里逐词打印PDF文本,但没法把这些文本拿到外部存成字符串或数组来做内容检查,对吧?这其实是异步操作的特性在搞鬼,咱们一步步搞定它。

问题根源

pdfreader.PdfReader().parseBuffer()是一个异步方法,它会逐步遍历PDF内容并触发回调。如果你直接在外部定义一个变量,然后在回调里给它赋值,外部代码往往会在回调完成前就执行,导致拿不到完整的文本数据。

解决方案1:用数组收集,在解析完成后处理

我们可以先定义一个数组来存储所有文本片段,等到PDF解析完成(也就是回调里的item为null时),再去使用这个数组或把它转成字符串做检查:

const fs = require('fs');
const pdfreader = require('pdfreader');

const pdfFilePath = '你的PDF文件路径.pdf';
let pdfTextArray = []; // 用来存储所有PDF文本片段的数组

fs.readFile(pdfFilePath, (err, pdfBuffer) => {
  if (err) {
    console.error('读取PDF文件出错:', err);
    return;
  }

  new pdfreader.PdfReader().parseBuffer(pdfBuffer, function(err, item) {
    if (err) {
      console.error('解析PDF出错:', err);
      return;
    }

    // 当item为null时,说明整个PDF已经解析完成
    else if (!item) {
      // 把数组转成完整字符串
      const fullPdfText = pdfTextArray.join(' ');
      console.log('完整PDF文本:', fullPdfText);

      // 检查目标文本是否存在
      const targetText = '你要查找的文本内容';
      if (fullPdfText.includes(targetText)) {
        console.log(`找到了目标文本:${targetText}`);
      } else {
        console.log(`未找到目标文本:${targetText}`);
      }
    }

    // 收集每一段文本片段
    else if (item.text !== undefined) {
      pdfTextArray.push(item.text);
    }
  });
});

解决方案2:用Promise封装,配合async/await让代码更清晰

如果你的业务逻辑比较复杂,用Promise封装提取文本的逻辑,再配合async/await可以让代码结构更直观,避免回调嵌套:

const fs = require('fs').promises; // 使用Promise版本的fs模块
const pdfreader = require('pdfreader');

// 封装提取PDF文本的函数
function extractPdfText(pdfFilePath) {
  return new Promise((resolve, reject) => {
    let pdfTextArray = [];

    fs.readFile(pdfFilePath)
      .then(pdfBuffer => {
        new pdfreader.PdfReader().parseBuffer(pdfBuffer, function(err, item) {
          if (err) {
            reject(err);
            return;
          }
          if (!item) {
            // 解析完成,返回拼接好的完整文本
            resolve(pdfTextArray.join(' '));
            return;
          }
          if (item.text !== undefined) {
            pdfTextArray.push(item.text);
          }
        });
      })
      .catch(err => reject(err));
  });
}

// 使用async/await调用函数并检查内容
async function checkPdfContent() {
  try {
    const fullPdfText = await extractPdfText('你的PDF文件路径.pdf');
    console.log('完整PDF文本:', fullPdfText);

    const targetText = '你要查找的文本内容';
    if (fullPdfText.includes(targetText)) {
      console.log(`找到了目标文本:${targetText}`);
    } else {
      console.log(`未找到目标文本:${targetText}`);
    }
  } catch (err) {
    console.error('处理过程出错:', err);
  }
}

// 执行检查函数
checkPdfContent();

关键要点

核心就是要等待异步的PDF解析操作完全完成后,再去使用收集到的文本。不能在解析过程中直接访问外部变量,因为那时候文本还没收集完整。

内容的提问来源于stack exchange,提问作者naresh surya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:30