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

如何从PDF流中获取总页数?求支持流式解析的类pdf-parse库

从PDF流式数据中提取总页数的可行方案

针对大PDF文件无法全量加载到内存的场景,确实有可以流式解析PDF元数据(包括总页数)的工具库,以下是具体方案:

1. 使用 pdfjs-dist(Mozilla官方PDF处理库)

pdfjs-dist 支持在Node.js环境下进行流式解析,无需加载整个PDF文件即可提取页数,可结合axios的流直接处理:

const axios = require('axios');
const pdfjsLib = require('pdfjs-dist/legacy/build/pdf.js');

async function getPdfPageCountFromStream() {
  const response = await axios.get(file.href, {
    responseType: 'stream'
  });

  // 配置PDF.js流式加载参数
  const pdfDoc = await pdfjsLib.getDocument({
    data: response.data,
    useWorkerFetch: false, // Node.js环境下禁用worker fetch
    disableFontFace: true, // 跳过字体加载以提升解析速度
  }).promise;

  const pageCount = pdfDoc.numPages;
  console.log('总页数:', pageCount);
  await pdfDoc.destroy(); // 及时释放资源
}

getPdfPageCountFromStream();

2. 使用 pdf-stream-parser

这个轻量库专门针对PDF流式数据解析,能直接从流中提取元数据信息,包括页数:

const axios = require('axios');
const PdfStreamParser = require('pdf-stream-parser');

async function getPageCount() {
  const response = await axios.get(file.href, {
    responseType: 'stream'
  });

  const parser = new PdfStreamParser();
  let pageCount = null;

  parser.on('pdf-parse-ready', (pdfData) => {
    pageCount = pdfData.metadata.pageCount;
    console.log('总页数:', pageCount);
    // 获取到页数后可终止流读取
    response.data.destroy();
  });

  response.data.pipe(parser);
}

getPageCount();

3. 手动流式解析(轻量无依赖)

如果不想引入第三方库,可利用PDF文件的结构特性:PDF的页数信息通常在文件尾部的trailer段中,通过流式读取直到匹配到/Count字段即可提取页数:

const axios = require('axios');

async function extractPageCountFromStream() {
  const response = await axios.get(file.href, {
    responseType: 'stream'
  });

  let bufferChunks = [];
  let foundPageCount = false;

  response.data.on('data', (chunk) => {
    if (foundPageCount) return;
    bufferChunks.push(chunk);
    const content = Buffer.concat(bufferChunks).toString();
    
    // 匹配PDF trailer中的页数字段
    const pageCountMatch = content.match(/\/Count\s+(\d+)/);
    if (pageCountMatch) {
      console.log('总页数:', parseInt(pageCountMatch[1], 10));
      foundPageCount = true;
      response.data.destroy(); // 停止读取流
    }
  });

  response.data.on('end', () => {
    if (!foundPageCount) {
      console.log('未找到页数信息');
    }
  });
}

extractPageCountFromStream();

注意:手动解析的方法依赖PDF的标准结构,部分非标准生成的PDF可能无法准确匹配,优先推荐使用成熟的第三方库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:02:57