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

如何使用React Js将扫描版PDF转为可搜索PDF?求解决方案

扫描版PDF转可搜索PDF的React实现方案

React本身只是前端UI框架,不具备OCR识别和PDF编辑的核心能力,但可以通过组合前端开源库实现需求,以下是两种可行方案:

一、纯前端实现方案

核心思路:提取PDF每页图片→OCR识别文本→生成带透明文本层的新PDF
需要用到三个关键库:

  • pdfjs-dist:解析PDF并将每页转为Canvas
  • tesseract.js:浏览器端OCR识别,支持多语言
  • pdf-lib:创建/编辑PDF,添加图片和文本层

步骤与代码示例

  1. 安装依赖
npm install tesseract.js pdfjs-dist pdf-lib
  1. 核心转换函数
import Tesseract from 'tesseract.js';
import { getDocument } from 'pdfjs-dist';
import { PDFDocument, rgb } from 'pdf-lib';

// 预加载OCR语言包(可选,提升首次识别速度)
Tesseract.loadLanguage('eng+chi_sim');

async function convertScannedPdf(pdfFile) {
  // 1. 解析PDF,提取每页Canvas
  const pdfDoc = await getDocument({ data: new Uint8Array(await pdfFile.arrayBuffer()) }).promise;
  const pageCount = pdfDoc.numPages;
  const newPdf = await PDFDocument.create();

  for (let pageNum = 1; pageNum <= pageCount; pageNum++) {
    const originalPage = await pdfDoc.getPage(pageNum);
    const viewport = originalPage.getViewport({ scale: 2 }); // 放大提升OCR精度
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    canvas.width = viewport.width;
    canvas.height = viewport.height;
    await originalPage.render({ canvasContext: ctx, viewport }).promise;

    // 2. OCR识别文本及位置信息
    const { data: { blocks } } = await Tesseract.recognize(canvas, 'eng+chi_sim');

    // 3. 生成新PDF页面,添加原图片和透明文本层
    const imageBytes = await canvas.toDataURL('image/png');
    const embeddedImage = await newPdf.embedPng(imageBytes);
    const newPage = newPdf.addPage([viewport.width / 2, viewport.height / 2]); // 还原缩放比例
    newPage.drawImage(embeddedImage, {
      x: 0,
      y: 0,
      width: newPage.getWidth(),
      height: newPage.getHeight(),
    });

    // 添加透明文本(用户不可见但可搜索)
    blocks.forEach(block => {
      block.lines.forEach(line => {
        const { x1, y1, x2, y2 } = line.bbox;
        // 转换坐标:Canvas原点在左上角,PDF原点在左下角
        const pdfX = x1 / 2;
        const pdfY = newPage.getHeight() - y2 / 2;
        const fontSize = (y2 - y1) / 2;

        newPage.drawText(line.text, {
          x: pdfX,
          y: pdfY,
          size: fontSize,
          opacity: 0, // 完全透明
          color: rgb(0, 0, 0),
        });
      });
    });
  }

  // 导出可搜索PDF
  const pdfBytes = await newPdf.save();
  const blob = new Blob([pdfBytes], { type: 'application/pdf' });
  const downloadLink = document.createElement('a');
  downloadLink.href = URL.createObjectURL(blob);
  downloadLink.download = 'searchable-output.pdf';
  downloadLink.click();
}

注意事项

  • 大文件/多页PDF会占用较多浏览器资源,OCR速度较慢,建议限制单文件页数或提示用户等待
  • 中文识别需确保加载chi_sim语言包,可通过CDN预加载优化速度
  • 若需更高识别精度,可调整Canvas缩放比例(如scale:3),但会增加性能消耗

二、前端+后端协同方案

如果纯前端方案性能无法满足需求,可将PDF上传至后端处理:

  1. 前端用React将PDF文件上传至后端接口
  2. 后端使用Tesseract(Python版本)、百度OCR/阿里云OCR等工具完成识别
  3. 后端生成可搜索PDF后返回给前端下载

这种方案适合大文件处理,识别精度和速度更优,且无需占用前端资源

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:37:52