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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:25:23