Skip to Content

OCR

El OCR aparece en cuatro contextos: entradas imagen (Tesseract), PDF en Node (vía pdf.ocr y rasterización), la API facetada runOcr (rama PDF forzada + imágenes) y el paquete raster @dragon708/docmind-ocr (usado por OCR lab y POST /api/analyze con options). Los detalles dependen de las versiones—ver package.json de este repo.

Modos PDF (Node / pdf.ocr)

En el paquete servidor, el PDF se controla con NodeAnalyzeOptions.pdf, en particular ocr:

ValorRol (alto nivel)
offEvita el análisis tipo OCR raster cuando el pipeline respeta esa política.
autoEl analizador PDF decide si hace falta OCR.
forcePrefiere la ruta pesada de OCR cuando aplica.

Opcionalmente pdf.ocrLangs y ocr.langs pasan idioma a los motores.

Playground — POST /api/analyze

La ruta valida ocrMode como off, auto o force. Se mapea a pdf.ocr (y opciones relacionadas) para:

  • analyze, explain-plan, extract-text, convert-html
  • pdf-extract-text-by-page y pdf-extract-pages: si ocrMode no es off, el playground usa runPdfOcrPipeline de @dragon708/docmind-pdf/pipeline (native-first con auto, estrategia ocrStrategy con force). Con off, solo la capa de texto de PDF.js (vacía en escaneos puros).

Para runOcr, el paquete node aplica su propia política PDF forzada; ocrMode sigue siendo obligatorio en el formulario pero no cambia la semántica de runOcr.

Con action=ocr y options que eligen el paquete (implementation: "pkg", o engine: "docmind-ocr", o source: "pkg"), la ruta llama a ocr() de @dragon708/docmind-ocr en lugar de runOcr de Node. Esa rama va orientada a imagen/TIFF (no a la faceta PDF de Node).

FormData: ocrMode --> pdf.ocr = off | auto | force (donde la acción use OCR PDF)

Paquete raster y options (@dragon708/docmind-ocr)

El playground expone ocr-detailed, ocr-tiff, normalize-only, preprocess-only y extract-structured (StructuredDocumentResult vía extractStructuredData en Node), más ocr respaldado por el paquete como arriba. Envía JSON en options cuando la acción lo use (ver Resumen de API, OCR raster y extract-structured).

TemaNotas
UIOCR lab arma action, language, ocrMode y options para POST /api/analyze multipart.
langsMejor options.langs; si va vacío, la ruta usa language recortado.
TIFFocr-tiff: options.maxPages, options.pageSeparator. ocr() también enruta TIFF multipágina a ocrTiff.
Preprocessoptions.preprocess: grayscale, threshold, resize, normalize (ver PreprocessImageOptions del paquete).
Debugoptions.debug.returnNormalized / returnPreprocessed: incluyen PNG base64 en JSON en normalize-only / preprocess-only.
ocrModeEn acciones solo raster, ocrMode inválido se asume auto (validación flexible).

Uso en proceso (Node o navegador, según sharp opcional):

import { ocr, ocrTiff, normalizeImageForOcr } from "@dragon708/docmind-ocr"; await ocr(fileBytes, { langs: "eng" }); await ocrTiff(tiffBytes, { maxPages: 20, pageSeparator: "\n\n" }); await normalizeImageForOcr(heicBytes, { mimeHint: "image/heic" });

Las respuestas correctas con imágenes embebidas DOCX pasan por sanitizeDocxBinaryForJson para no serializar Uint8Array como objetos enormes; ver Resumen de API.

BrowserAnalyzeOptions.ocr.langs se reenvía al OCR de imagen (cadena de idioma Tesseract, p. ej. eng, eng+spa).

Campo language del playground

docmind-client y docmind-server mapean una cadena language no vacía a ocr.langs y, en servidor, pdf.ocrLangs. Recorta valores vacíos antes de enviar.

import { analyzeFile } from "@dragon708/docmind-browser"; import "@dragon708/docmind-docx"; await analyzeFile(file, { ocr: { langs: "eng" } });

Rendimiento

  • Navegador: el OCR compite con el hilo principal y el bundle; imágenes grandes cuestan más memoria y tiempo.
  • Node: en servidor evitas enviar bytes a cada cliente, pero sumas CPU/IO; reutiliza un Uint8Array por petición cuando puedas.

Serverless (Next.js y Vercel)

Los builds de producción de Next.js usan output file tracing para decidir qué ficheros van con cada ruta de servidor. Vercel (y análogos) despliega ese bundle en funciones Node serverless. PDF.js puede quedarse sin pdf.worker.mjs (fake worker / Setting up fake worker failed), y el worker de Tesseract más deps hoisteadas (p. ej. bmp-js) suelen faltar en el trace: PDF y OCR funcionan en local y en producción fallan con MODULE_NOT_FOUND.

Este playground lo corrige con outputFileTracingIncludes para /api/analyze en next.config.ts (globs de pdfjs-dist + Tesseract). Si reutilizas el patrón en tu app Next.js, replica la clave de ruta y los globs en cada entrada de servidor con el mismo stack. Detalle: Instalación.

Comparar comportamiento

Usa Client test, Server test (POST /api/analyze), PDF lab, DOCX lab y OCR lab con el mismo u otros ficheros para comparar PDF (servidor y modos OCR), DOCX, OCR raster/TIFF y texto.

Ver también

Last updated on