ppu-paddle-ocr
Version:
Lightweight, probably the fastest PaddleOCR SDK in TypeScript. Runs anywhere JavaScript runs: Node.js, Bun, Deno, mobile react-native, web browsers, and browser extensions. Docker & CLI supported. The official SDK is browser-only. Accurate text detection
1 lines • 4.39 kB
JavaScript
import{MODEL_PRESETS}from"../model-catalogue.js";import{usageError}from"./io.js";export let PARSE_OPTIONS={strategy:{type:"string"},"cross-line-width-factor":{type:"string"},engine:{type:"string"},"image-height":{type:"string"},flatten:{type:"boolean"},"no-cache":{type:"boolean"},model:{type:"string"},"model-detection":{type:"string"},"model-recognition":{type:"string"},"model-dict":{type:"string"},"max-side-length":{type:"string"},"padding-vertical":{type:"string"},"padding-horizontal":{type:"string"},"min-area":{type:"string"},mean:{type:"string"},std:{type:"string"},"execution-providers":{type:"string"},concurrency:{type:"string"},settle:{type:"boolean"},output:{type:"string",short:"o"},json:{type:"boolean"},pretty:{type:"boolean"},quiet:{type:"boolean",short:"q"},verbose:{type:"boolean"},debug:{type:"boolean"},"debug-folder":{type:"string"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"}};let STRATEGIES=["per-box","per-line","cross-line"];let ENGINES=["opencv","canvas-native"];function num(values,key){let raw=values[key];if(raw===undefined)return;let n=Number(raw);if(Number.isNaN(n))usageError(`--${key} must be a number, got "${String(raw)}"`);return n}function triple(values,key){let raw=values[key];if(raw===undefined)return;let parts=String(raw).split(",").map((p)=>Number(p.trim()));if(parts.length!==3||parts.some(Number.isNaN)){usageError(`--${key} must be three comma-separated numbers, e.g. 0.485,0.456,0.406`)}return parts}function strategy(values){let raw=values.strategy;if(raw===undefined)return;if(!STRATEGIES.includes(raw)){usageError(`--strategy must be one of ${STRATEGIES.join(" | ")}`)}return raw}function engine(values){let raw=values.engine;if(raw===undefined)return;if(!ENGINES.includes(raw)){usageError(`--engine must be one of ${ENGINES.join(" | ")}`)}return raw}function modelPreset(values){let raw=values.model;if(raw===undefined)return;let preset=MODEL_PRESETS[String(raw)];if(!preset){usageError(`--model must be one of: ${Object.keys(MODEL_PRESETS).join(", ")}`)}return preset}export function buildPaddleOptions(values){let options={};let preset=modelPreset(values);let detection=values["model-detection"];let recognition=values["model-recognition"];let dict=values["model-dict"];if(preset||detection||recognition||dict){options.model={...preset,...detection?{detection}:{},...recognition?{recognition}:{},...dict?{charactersDictionary:dict}:{}}}let mean=triple(values,"mean");let stdDeviation=triple(values,"std");let maxSideLength=num(values,"max-side-length");let paddingVertical=num(values,"padding-vertical");let paddingHorizontal=num(values,"padding-horizontal");let minimumAreaThreshold=num(values,"min-area");if(mean||stdDeviation||maxSideLength!==undefined||paddingVertical!==undefined||paddingHorizontal!==undefined||minimumAreaThreshold!==undefined){options.detection={...mean?{mean}:{},...stdDeviation?{stdDeviation}:{},...maxSideLength!==undefined?{maxSideLength}:{},...paddingVertical!==undefined?{paddingVertical}:{},...paddingHorizontal!==undefined?{paddingHorizontal}:{},...minimumAreaThreshold!==undefined?{minimumAreaThreshold}:{}}}let strat=strategy(values);let imageHeight=num(values,"image-height");let crossLineWidthFactor=num(values,"cross-line-width-factor");options.recognition={charactersDictionary:[],...strat?{strategy:strat}:{},...imageHeight!==undefined?{imageHeight}:{},...crossLineWidthFactor!==undefined?{crossLineWidthFactor}:{}};let eng=engine(values);if(eng)options.processing={engine:eng};let providers=values["execution-providers"];if(providers){options.session={executionProviders:providers.split(",").map((p)=>p.trim())}}if(values.verbose||values.debug||values["debug-folder"]){options.debugging={...values.verbose?{verbose:true}:{},...values.debug?{debug:true}:{},...values["debug-folder"]?{debugFolder:values["debug-folder"]}:{}}}return options}export function buildRecognizeOptions(values){return{...values.flatten?{flatten:true}:{},...values["no-cache"]?{noCache:true}:{},...strategy(values)?{strategy:strategy(values)}:{}}}export function buildBatchOptions(values){let raw=values.concurrency;let concurrency;if(raw!==undefined){if(raw==="auto"){concurrency="auto"}else{let n=Number(raw);if(Number.isNaN(n)||n<1)usageError(`--concurrency must be a positive number or "auto"`);concurrency=n}}return{...buildRecognizeOptions(values),...concurrency!==undefined?{concurrency}:{}}}