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

React Next.js中提取PDF希伯来语文本遇问题求解决方案

解决Next.js + TypeScript中PDF.js提取希伯来语文本乱码及执行异常问题

一、先修复代码执行异常

1. 解决Promise.withResolvers报错

这个错误是由于Node.js版本低于20.x导致的(Promise.withResolvers是Node.js 20+新增API),或者pdf.js版本与当前Node环境不兼容。两种解决方式:

  • 升级Node.js至20.x及以上版本
  • 降级pdf.js到不依赖该API的版本,例如^3.11.174

2. 修复代码卡住问题

你第二段代码的核心问题是await pdfjsLib.getDocument(...).promise.then(...)的返回值为undefined(then回调未返回PDF实例),导致后续调用pdf.getPage(1)抛出未捕获的错误,表现为执行卡住。修正后的代码:

import * as pdfjsLib from "pdfjs-dist/build/pdf";
import pdfjsWorker from "pdfjs-dist/build/pdf.worker.entry";

pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;

export async function getDocumentText(filePath?: string, fileUrl?: string) {
  const path = filePath ?? fileUrl;
  if (!path) {
    console.error("[PaycheckDataExtractor]: 未提供有效路径");
    return;
  }
  console.log(`[PaycheckDataExtractor]: Path: ${path}`);
  
  try {
    const pdf = await pdfjsLib.getDocument({ url: path, verbosity: 1 }).promise;
    console.log(`[PaycheckDataExtractor]: PDF加载完成: ${pdf.numPages}页`);
    
    const page = await pdf.getPage(1);
    console.log(`[PaycheckDataExtractor]: 获取第1页成功`);
    
    const textContent = await page.getTextContent();
    return textContent;
  } catch (error) {
    console.error("[PaycheckDataExtractor]: 处理PDF出错:", error);
  }
}

二、解决希伯来语文本乱码问题

1. 确认PDF类型

如果是扫描版PDF(图片转PDF),文本提取本身会失败,需要搭配OCR工具(如Tesseract.js)处理,Tesseract支持希伯来语训练数据。

2. 处理RTL文本顺序

希伯来语是从右到左(RTL)的语言,pdf.js提取的文本可能出现字符顺序颠倒,可通过Intl.Segmenter修正:

// 在获取textContent后添加
const rawText = textContent.items.map((item: any) => item.str).join('');
const segmenter = new Intl.Segmenter('he', { granularity: 'grapheme' });
const segments = segmenter.segment(rawText);
const correctHebrewText = Array.from(segments).map(s => s.segment).reverse().join('');
console.log(`修正后的希伯来语文本: ${correctHebrewText}`);

3. 配置字体支持

若PDF使用自定义希伯来语字体,需配置pdf.js加载对应字体映射:

const pdf = await pdfjsLib.getDocument({
  url: path,
  verbosity: 1,
  cMapUrl: 'https://unpkg.com/pdfjs-dist@3.11.174/cmaps/',
  cMapPacked: true,
}).promise;

三、Next.js环境特殊配置

在next.config.js中添加webpack配置以兼容pdf.js:

/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config) => {
    config.resolve.alias.set('pdfjs-dist', 'pdfjs-dist/build/pdf');
    config.module.rules.push({
      test: /\.worker\.mjs$/,
      use: { loader: 'worker-loader' },
    });
    return config;
  },
  // App Router环境下需开启
  experimental: {
    serverComponentsExternalPackages: ['pdfjs-dist'],
  },
};

module.exports = nextConfig;

同时安装依赖:

npm install pdfjs-dist worker-loader

四、扫描版PDF的OCR处理方案

如果是扫描件,使用Tesseract.js做希伯来语OCR:

import Tesseract from 'tesseract.js';

export async function extractScannedHebrewPDF(file: File) {
  const { data: { text } } = await Tesseract.recognize(
    file,
    'heb',
    { logger: m => console.log(m) }
  );
  console.log('OCR提取的希伯来语文本:', text);
  return text;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 13:07:24