当前位置: 首页 > news >正文

react+Tesseract.js实现前端拍照获取/选择文件等文字识别OCR

需求背景

在开发过程中可能会存在用户上传一张图片后下方需要自己识别出来文字数字等信息,有的时候会通过后端来识别后返回,但是也会存在纯前端去识别的情况,这个时候就需要使用到Tesseract.js这个库了   附Tesseract.js官方(https://github.com/naptha/tesseract.js)

实现过程

 主要的实现代码部分和这部分的简易效果图

import {createWorker} from 'tesseract.js';

const worker = await createWorker();
await worker.loadLanguage('chi_sim');
await worker.initialize('chi_sim');
const { data: { text } } = await worker.recognize(myImage);
console.log(text);
await worker.terminate();

下方是一个简单的完整实现案例 ⬇ 

npm install tesseract.js

1. createWorker创建worker实例。

2. 调用worker.loadLanguage('chi_sim')。

3. 调用worker.initialize('chi_sim')。

4. 然后调用recognize方法进行识别。

import React, { useState, useEffect } from 'react';
import { createWorker } from 'tesseract.js';

const OCRComponent = () => {
  const [image, setImage] = useState(null);
  const [text, setText] = useState('');
  const [progress, setProgress] = useState(0);
  const [error, setError] = useState('');
  const [worker, setWorker] = useState(null);

  // 初始化 Worker
  useEffect(() => {
    const initializeWorker = async () => {
      const newWorker = await createWorker();
      setWorker(newWorker);
    };
    initializeWorker();
    return () => {
      if (worker) {
        worker.terminate();
      }
    };
  }, []);

  // 处理图片上传
  const handleImageUpload = (e) => {
    const file = e.target.files[0];
    if (file) {
      const reader = new FileReader();
      reader.onloadend = () => {
        setImage(reader.result);
      };
      reader.readAsDataURL(file);
      setText('');
      setError('');
    }
  };

  // 执行 OCR 识别
  const recognizeText = async () => {
    if (!worker || !image) return;

    try {
      //chi_sim代表的是简体中文包  eng是英文  需要识别其他语言的话可以官网去看下对应的名称
      await worker.loadLanguage('chi_sim');
      await worker.initialize('chi_sim');
      const { data: { text } } = await worker.recognize(image, {
        logger: (m) => {
          if (m.status === 'recognizing text') {
            setProgress(Math.round(m.progress * 100));
          }
        }
      });
      setText(text);
    } catch (err) {
      setError('识别失败,请重试或更换图片。');
      console.error(err);
    } finally {
      await worker.terminate();
    }
  };

  return (
    <div>
      <h1>中文 OCR 文字识别</h1>
      
      {/* 文件上传 */}
      <input type="file" accept="image/*" onChange={handleImageUpload} />
      
      {/* 图片预览 */}
      {image && (
        <div>
          <h3>图片预览</h3>
          <img src={image} alt="预览" style={{ maxWidth: '100%', height: 'auto' }} />
        </div>
      )}

      {/* 识别按钮及进度 */}
      {image && (
        <div>
          <button onClick={recognizeText} disabled={progress > 0}>
            {progress > 0 ? `识别中... ${progress}%` : '开始识别'}
          </button>
        </div>
      )}

      {/* 显示结果 */}
      {text && (
        <div>
          <h3>识别结果</h3>
          <pre style={{ whiteSpace: 'pre-wrap' }}>{text}</pre>
        </div>
      )}

      {/* 错误提示 */}
      {error && <p style={{ color: 'red' }}>{error}</p>}
    </div>
  );
};

export default OCRComponent;

相关文章:

  • TPS入门DAY04 服务器篇
  • 文件内容课堂总结
  • 14 nginx 的 dns 缓存的流程
  • 为了避免unboundLocalError和为什么X的值一直不变呢?
  • Gartner发布软件供应链安全市场指南:软件供应链安全工具的8个强制功能、9个通用功能及全球29家供应商
  • 如何查看linux history命令文件
  • 【pm2】pm2启动无法访问接口 ,node命令启动却可以
  • 使用nhdeep档案目录打印工具生成干部人事档案目录打印文件
  • 0501路由-react-仿低代码平台项目
  • [问题帖] vscode 重启远程终端
  • jsoup解析页面保留换行符
  • 计算机视觉色彩空间全解析:RGB、HSV与Lab的实战对比
  • 蓝桥杯C/C++省赛/国赛注意事项及运行环境配置
  • 淘宝商品数据实时抓取 API 开发指南:从接口申请到数据解析实战
  • [原创](现代Delphi 12指南): 设置、运行和调试你的第一个macOS应用程序.
  • JZ31 栈的压入、弹出序列
  • 穿透三层内网VPC1
  • 反转链表系列
  • UVa1367/LA3532 Nuclear Plants
  • 第十五届蓝桥杯大赛软件赛省赛Python 大学 B 组试做(下)【本期题单: 缴纳过路费, 纯职业小组】
  • 高阳网站建设/深圳做网站的
  • 做网站的价/seo网站培训班
  • 企业公司网站管理系统/营销型企业网站案例
  • 企业网站怎么做推广/品牌营销理论有哪些
  • 做网站必须要注册公司么/专门的网页制作工具有
  • 中企高呈网站建设/注册平台