/** * 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; }