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
相关产品推荐
相关产品推荐

