Tesseract.js作为运行在浏览器端的OCR识别工具,能够直接处理图片中的文字内容,无需依赖后端服务,在表单识别、文档提取等场景中应用广泛。但在处理多栏排版的文档时,默认的识别模式往往会将不同栏的内容混合拼接,导致识别结果顺序混乱,准确率也会明显下降。页面分段模式PSM是Tesseract识别引擎的核心参数之一,它的作用是告诉识别引擎待处理图片的文字排版特征,合理设置该参数可以大幅提升多栏文本的识别效果。

什么是PSM模式
PSM全称是Page Segmentation Mode,即页面分段模式,是Tesseract用于定义图片中文字排版结构的参数。Tesseract.js沿用了Tesseract引擎的PSM参数体系,不同的PSM值对应不同的排版假设,识别引擎会根据设定的模式调整文字检测、分块和识别的逻辑。
常用的PSM模式有以下几种:
- PSM 0:仅方向和脚本检测,不执行识别
- PSM 3:默认模式,自动分段页面,适合大多数单栏文本场景
- PSM 4:假设文本是单栏可变大小的文本
- PSM 6:假设文本是单栏统一的块
- PSM 11:稀疏文本,没有特定顺序
- PSM 12:稀疏文本,带OSD(方向和脚本检测)
多栏文本识别的常见问题
多栏文本指的是同一页面中存在两栏及以上独立排版的文字区域,比如常见的期刊论文、报纸版面、产品说明书等。使用默认的PSM 3模式处理这类图片时,会出现两个典型问题:
第一个是内容顺序错乱。识别引擎会按照图片中文字出现的物理位置从上到下、从左到右扫描,导致第一栏末尾的内容和第二栏开头的内容被拼接在一起,完全不符合人类阅读的多栏阅读顺序。
第二个是识别准确率下降。多栏文本的分栏间隔、不同栏的字号差异会让默认的分段逻辑失效,识别引擎可能将分栏线识别为文字,或者把相邻栏的内容错误合并为一个识别块,产生大量乱码和错误内容。
多栏文本场景下的PSM选择策略
针对不同的多栏文本特征,需要选择不同的PSM模式来优化识别效果:
规则多栏文本
如果多栏文本的栏宽固定、分栏清晰,比如标准的双栏论文,推荐使用PSM 4模式。该模式假设文本是单栏可变大小,但实际上识别引擎会更倾向于按垂直方向分块,能够较好地保持单栏内的内容顺序,后续只需要对识别结果做简单的分栏切割即可。
不规则多栏文本
如果多栏文本的分栏宽度不一致、存在图文混排,推荐使用PSM 11模式。该模式假设文本是稀疏且无固定顺序的,识别引擎会先检测所有独立的文字块,再按照块的位置排序,开发者可以拿到所有文字块的坐标信息,自行按照分栏规则排序。
带复杂排版的文档
如果文档有多栏同时还有页眉页脚、侧边标注等内容,可以先使用PSM 0做方向检测,确认图片方向正确后,再用PSM 12模式识别,该模式会在稀疏文本识别的基础上自动检测文字的方向和脚本,减少排版干扰带来的识别错误。
完整代码示例
下面是使用Tesseract.js结合PSM模式识别多栏文本的示例代码,代码中使用了PSM 11模式,并且会输出每个文字块的坐标信息,方便后续做分栏排序:
// 引入Tesseract.js
import Tesseract from 'tesseract.js';
// 多栏文本图片路径
const imagePath = 'multi_column_text.png';
// 识别函数
async function recognizeMultiColumnText() {
try {
// 创建worker实例
const worker = await Tesseract.createWorker();
// 加载英文和中文语言包,按需调整
await worker.loadLanguage('chi_sim+eng');
await worker.initialize('chi_sim+eng');
// 设置PSM模式为11,稀疏文本无特定顺序
await worker.setParameters({
tessedit_pageseg_mode: Tesseract.PSM.SPARSE_TEXT
});
// 执行识别
const { data } = await worker.recognize(imagePath);
// 输出识别到的所有文字块
console.log('识别到的文字块数量:', data.blocks.length);
data.blocks.forEach((block, index) => {
console.log(`第${index + 1}个文字块内容:`, block.text);
console.log('文字块坐标:', block.bbox);
});
// 根据文字块的x坐标分栏排序
const sortedBlocks = data.blocks.sort((a, b) => {
// 先按x坐标排序,区分不同栏
if (Math.abs(a.bbox.x0 - b.bbox.x0) > 50) {
return a.bbox.x0 - b.bbox.x0;
}
// 同一栏内按y坐标排序
return a.bbox.y0 - b.bbox.y0;
});
// 拼接最终识别结果
const finalText = sortedBlocks.map(block => block.text).join('n');
console.log('最终排序后的识别结果:', finalText);
// 终止worker
await worker.terminate();
} catch (error) {
console.error('识别失败:', error);
}
}
// 执行识别
recognizeMultiColumnText();
PSM参数调优建议
在实际使用中,还可以结合其他参数进一步优化识别效果:
- 如果图片存在倾斜,可以先做图片旋转校正,再设置PSM参数,避免方向错误影响分段逻辑
- 可以适当调整
tessedit_char_whitelist参数,设置识别白名单,减少无关字符的干扰 - 如果识别结果中仍有少量分栏错误,可以结合文字块的宽度阈值,自动判断不同栏的边界,再做二次排序
- 对于固定版式的多栏文档,可以提前裁剪出每一栏的区域,分别用PSM 6模式识别,准确率会更高
通过合理选择PSM模式,Tesseract.js在多栏文本识别场景下的效果可以得到明显提升,开发者可以根据实际的文档特征灵活调整参数,满足不同项目的识别需求。
Tesseract.jsPSM多栏文本识别OCR优化修改时间:2026-06-21 18:48:21