pdf2json无法提取PDF段落数据,求Node.js替代npm包
Node.js中按段落提取PDF内容的替代方案
1. pdf-parse
基于pdf.js构建的轻量PDF文本提取库,能较好保留原文档的段落结构,对含表格、普通段落的PDF适配性不错,无需复杂配置即可快速提取文本。
使用示例:
const fs = require('fs'); const pdfParse = require('pdf-parse'); async function extractPDFText(filePath) { const dataBuffer = fs.readFileSync(filePath); const data = await pdfParse(dataBuffer); // 提取的文本自带段落分隔,直接写入文件 fs.writeFileSync('output.txt', data.text); } extractPDFText('./your-document.pdf');
它会自动识别PDF中的换行与段落间隔,输出文本基本匹配原文档的段落逻辑;表格内容会以文本形式保留大致行列格式。
2. pdfjs-dist
Mozilla官方的PDF处理库,是pdf-parse的底层依赖,适合需要精细控制段落识别规则的场景。可通过获取页面文本块的位置信息,手动组合段落。
使用示例:
const fs = require('fs'); const pdfjsLib = require('pdfjs-dist/legacy/build/pdf'); async function extractParagraphs(filePath) { const dataBuffer = fs.readFileSync(filePath); const pdf = await pdfjsLib.getDocument({ data: dataBuffer }).promise; let fullText = ''; for (let i = 1; i <= pdf.numPages; i++) { const page = await pdf.getPage(i); const textContent = await page.getTextContent(); let currentParagraph = ''; let lastY = null; textContent.items.forEach(item => { // 通过文本块的y坐标差异判断段落(同一段落的文本块y坐标接近) if (currentParagraph && Math.abs(item.transform[5] - lastY) > 5) { fullText += currentParagraph.trim() + '\n\n'; currentParagraph = ''; } currentParagraph += item.str + ' '; lastY = item.transform[5]; }); if (currentParagraph) { fullText += currentParagraph.trim() + '\n\n'; } } fs.writeFileSync('output.txt', fullText); } extractParagraphs('./your-document.pdf');
可根据实际PDF的排版调整y坐标差值阈值,适配不同结构的文档。
3. hummus-pdf
专注于PDF处理与提取的库,支持提取结构化文本内容,对表格的文本结构保留更友好,同时可通过文本块位置识别段落。
使用示例:
const fs = require('fs'); const hummus = require('hummus'); function extractPDFText(filePath) { const pdfReader = hummus.createReader(filePath); let fullText = ''; for (let i = 0; i < pdfReader.getPagesCount(); i++) { const page = pdfReader.parsePage(i); const textContent = page.getTextContent(); let paragraphs = []; let currentPara = []; let lastY = null; textContent.forEach(block => { const y = block.y; if (lastY && Math.abs(y - lastY) > 4) { paragraphs.push(currentPara.join(' ').trim()); currentPara = []; } currentPara.push(block.str); lastY = y; }); if (currentPara.length > 0) { paragraphs.push(currentPara.join(' ').trim()); } fullText += paragraphs.join('\n\n') + '\n\n'; } fs.writeFileSync('output.txt', fullText); } extractPDFText('./your-document.pdf');
注意事项
- 所有文本提取库仅能提取图表中的内嵌文字(若有),无法提取图表本身,图表区域会以空白或对应标注文本呈现。
- 不同PDF的排版差异较大,可能需要根据实际文档调整段落识别的阈值(如y坐标差值)。
内容的提问来源于stack exchange,提问作者Naveen Mannem
相关产品推荐
相关产品推荐

