/**
* PaddleOCR-JS 增强版 - 类型定义
*/
///
///
declare global {
type CanvasImage = any;
}
/** 坐标点 */
export interface Point {
x: number;
y: number;
}
/** 文本框 */
export interface TextBox {
id: number;
box: Point[];
score: number;
}
/** 文本行 */
export interface TextLine {
text: string;
score: number;
box?: TextBox;
language?: string;
}
/** OCR 识别结果 */
export interface OCRResult {
textDetection: TextBox[];
textRecognition: TextLine[];
duration: {
preprocess: number;
detection: number;
recognition: number;
total: number;
};
imageWidth?: number;
imageHeight?: number;
angle?: number;
rotatedImage?: CanvasImage;
originalImage?: CanvasImage;
}
/** 表格识别结果 */
export interface TableResult {
table: {
cells: Array<{
row: number;
col: number;
content: string;
bbox: Point[];
}>;
bbox: Point[];
};
structure?: any;
format?: "html" | "markdown" | "excel";
html?: string;
markdown?: string;
duration: {
preprocess: number;
detection: number;
recognition: number;
total: number;
};
imageWidth?: number;
imageHeight?: number;
originalImage?: CanvasImage;
}
/** 版面分析结果 */
export interface LayoutResult {
regions: Array<{
type: "text" | "table" | "figure" | "title" | "header" | "footer";
bbox: Point[];
confidence: number;
box?: any;
score?: number;
content?: string;
}>;
duration: {
preprocess: number;
detection: number;
total: number;
};
imageWidth?: number;
imageHeight?: number;
pageWidth?: number;
pageHeight?: number;
originalImage?: CanvasImage;
}
/** 公式类型 */
export type FormulaType = "inline" | "block" | "inline_tex" | "block_tex" | "html";
/** 条码类型 */
export type BarcodeType = "qr" | "code128" | "code39" | "ean13" | "ean8" | "upca" | "upce" | string;
/** 公式识别结果 */
export interface FormulaResult {
formula: string;
type: "inline" | "block" | "inline_tex" | "block_tex" | "html";
bbox: Point[];
latex?: string;
tex?: string;
html?: string;
text?: string;
duration: {
preprocess: number;
recognition: number;
total: number;
};
imageWidth?: number;
imageHeight?: number;
originalImage?: CanvasImage;
}
/** 条码识别结果 */
export interface BarcodeResult {
barcode: string;
type: string;
bbox: Point[];
data?: string;
format?: string;
duration: {
preprocess: number;
detection: number;
recognition: number;
total: number;
};
imageWidth?: number;
imageHeight?: number;
originalImage?: CanvasImage;
}
/** 水印信息 */
export interface WatermarkInfo {
type: "watermark" | "logo";
position: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "center";
content?: string;
confidence: number;
}
/** 处理模式 */
export type ProcessMode = "text" | "table" | "layout" | "formula" | "barcode" | "all";
/** 语言选项 */
export type LanguageOption = "ch" | "en" | "fr" | "de" | "ja" | "ko";
/** 错误回调 */
export type ErrorCallback = (error: Error, stage?: string) => void;
/** 进度回调 */
export type ProgressCallback = (progress: number, message?: string) => void;
/** 处理选项 */
export interface ProcessOptions {
mode?: ProcessMode;
returnOriginalImage?: boolean;
useAngle?: boolean;
useDeskew?: boolean;
visualize?: boolean;
outputPath?: string;
onProgress?: ProgressCallback;
onError?: ErrorCallback;
}
/** 批量处理结果 */
export interface BatchOCRResult {
results: OCRResult[];
successCount: number;
failCount: number;
failedImages: string[];
totalDuration: number;
averageDuration: number;
}
/** 模型信息 */
export interface ModelInfo {
detection: string[];
recognition: string[];
version: string;
}
/** 支持的图像输入类型 */
export type ImageSource = HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | string | Buffer | Uint8Array | ArrayBuffer | {
data: Uint8Array;
width: number;
height: number;
};
/** 表格识别选项 */
export interface TableRecognitionOptions {
enableCoord?: boolean;
mergeSpans?: boolean;
format?: "html" | "markdown" | "excel";
}
/** 公式识别选项 */
export interface FormulaRecognitionOptions {
type?: "auto" | "inline" | "block" | "inline_tex" | "block_tex" | "html";
engine?: "mathpix" | "custom";
enableLatex?: boolean;
enableMathML?: boolean;
enableHTML?: boolean;
}
/** 版面分析选项 */
export interface LayoutAnalysisOptions {
regionTypes?: ("text" | "table" | "figure" | "title" | "header" | "footer")[];
minConfidence?: number;
}
/** 条码识别选项 */
export interface BarcodeRecognitionOptions {
formats?: string[];
minLength?: number;
maxLength?: number;
}
/** 水印检测选项 */
export interface WatermarkDetectionOptions {
types?: ("watermark" | "logo")[];
positions?: ("top-left" | "top-right" | "bottom-left" | "bottom-right" | "center")[];
minConfidence?: number;
}
/** PaddleOCR 配置选项 */
export interface PaddleOCROptions {
modelPath?: string;
useTensorflow?: boolean;
useONNX?: boolean;
useWasm?: boolean;
enableDetection?: boolean;
detectionModel?: "DB" | "DB++" | "EAST" | "PAN" | string;
detectionThreshold?: number;
detectionBoxThresh?: number;
detectionUnclipRatio?: number;
enableRecognition?: boolean;
recognitionModel?: "CRNN" | "SVTR" | "NRTR" | string;
language?: LanguageOption;
recognitionBeamSize?: number;
recognitionCandOverlapRatio?: number;
enableTable?: boolean;
enableLayout?: boolean;
enableFormula?: boolean;
enableBarcode?: boolean;
enableWatermark?: boolean;
tableOptions?: TableRecognitionOptions;
formulaOptions?: FormulaRecognitionOptions;
layoutOptions?: LayoutAnalysisOptions;
barcodeOptions?: BarcodeRecognitionOptions;
watermarkOptions?: WatermarkDetectionOptions;
cacheOptions?: {
maxSize?: number;
maxCount?: number;
ttl?: number;
enableResultCache?: boolean;
enableModelCache?: boolean;
};
performanceOptions?: {
threads?: number;
batchSize?: number;
memoryLimit?: number;
timeout?: number;
};
maxSideLen?: number;
enableCache?: boolean;
cacheSize?: number;
threshold?: number;
batchSize?: number;
enableGPU?: boolean;
numThreads?: number;
useMultiScale?: boolean;
useAngle_cls?: boolean;
onProgress?: ProgressCallback;
debugOptions?: {
verbose?: boolean;
logLevel?: "info" | "debug" | "trace";
saveIntermediateResults?: boolean;
};
}
/** 统计信息接口 */
export interface OCRStats {
totalRequests: number;
successfulRequests: number;
failedRequests: number;
averageDuration: number;
cacheHits: number;
cacheMisses: number;
}
/** 缓存统计信息 */
export interface CacheStats {
totalHits: number;
totalMisses: number;
hitRate: number;
size: number;
count: number;
}
/** 图像缓存接口 */
export interface ImageCacheInterface {
get(key: string): Promise;
set(key: string, value: Uint8Array, ttl?: number): Promise;
delete(key: string): Promise;
clear(): Promise;
getStats(): CacheStats;
has(key: string): Promise;
size(): Promise;
}
/** 结果缓存接口 */
export interface ResultCacheInterface {
get(imageHash: string, options: {
mode?: ProcessMode;
threshold?: number;
language?: LanguageOption;
}): Promise;
set(imageHash: string, result: OCRResult, options: {
mode?: ProcessMode;
threshold?: number;
language?: LanguageOption;
}, ttl?: number): Promise;
delete(imageHash: string, options: {
mode?: ProcessMode;
threshold?: number;
language?: LanguageOption;
}): Promise;
clear(): Promise;
getStats(): CacheStats;
generateKey(imageData: Uint8Array | string, options: {
mode?: ProcessMode;
threshold?: number;
language?: LanguageOption;
}): string;
}
/** 模型缓存接口 */
export interface ModelCacheInterface {
get(modelName: string): Promise;
set(modelName: string, model: any, ttl?: number): Promise;
delete(modelName: string): Promise;
clear(): Promise;
getStats(): CacheStats;
has(modelName: string): Promise;
}
/** 错误代码 */
export declare enum ErrorCode {
INVALID_IMAGE_FORMAT = 1001,
MODEL_LOAD_FAILED = 1002,
PROCESSING_TIMEOUT = 1003,
CACHE_ERROR = 1004,
NETWORK_ERROR = 1005,
CONFIG_ERROR = 1006,
INIT_FAILED = 1007,
RECOGNITION_FAILED = 1008,
MEMORY_LIMIT_EXCEEDED = 1009,
NOT_INITIALIZED = 1010,
UNKNOWN_ERROR = 9999
}
/** OCR 错误 */
export declare class OCRError extends Error {
code: ErrorCode;
stage?: string;
details?: any;
constructor(message: string, code: ErrorCode, stage?: string, details?: any);
}
/** 图像处理器接口 */
export interface ImageProcessorInterface {
loadImage(source: ImageSource): Promise<{
data: Uint8Array;
width: number;
height: number;
}>;
resizeImage(data: Uint8Array, width: number, height: number): Uint8Array;
normalizeImage(data: Uint8Array, width: number, height: number): Uint8Array;
generateCacheKey(data: Uint8Array): string;
}
/** 模型加载器接口 */
export interface ModelLoaderInterface {
loadDetectionModel(options: PaddleOCROptions): Promise;
loadRecognitionModel(options: PaddleOCROptions): Promise;
loadTableModel(options: PaddleOCROptions): Promise;
loadLayoutModel(options: PaddleOCROptions): Promise;
unloadModel(modelType: "detection" | "recognition" | "table" | "layout"): Promise;
}