如何在构造函数外部获取其内部生成的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
相关产品推荐
相关产品推荐

