{"version":3,"file":"ngx-scanner-text.mjs","sources":["../../../projects/ngx-scanner-text/src/lib/ngx-scanner-text.component.ts","../../../projects/ngx-scanner-text/src/lib/ngx-scanner-text.module.ts","../../../projects/ngx-scanner-text/src/lib/ngx-scanner-options.model.ts","../../../projects/ngx-scanner-text/src/public-api.ts","../../../projects/ngx-scanner-text/src/ngx-scanner-text.ts"],"sourcesContent":["import { Component, ElementRef, EventEmitter, OnDestroy, OnInit, ViewChild } from '@angular/core';\r\nimport { AsyncSubject, BehaviorSubject } from 'rxjs';\r\nimport { createWorker } from 'tesseract.js';\r\nimport { Configs, Page } from './ngx-scanner-options.model';\r\n\r\n\r\n@Component({\r\n  exportAs: 'scanner',\r\n  selector: 'ngx-scanner-text',\r\n  template: `<canvas #canvas></canvas>`,\r\n  queries: { canvas: new ViewChild('canvas', { static: true }) },\r\n  inputs: ['configs'],\r\n  outputs: ['event'],\r\n})\r\nexport class NgxScannerTextComponent implements OnInit, OnDestroy {\r\n\r\n  // Config\r\n  public configs!: Configs;\r\n\r\n  // Data\r\n  public event = new EventEmitter<Page>();\r\n  public data$ = new BehaviorSubject<Partial<Page>>({});\r\n  public logger$ = new BehaviorSubject({});\r\n  public image$ = new BehaviorSubject({width: 0, height: 0});\r\n\r\n  // Canvas\r\n  public canvas!: ElementRef<HTMLCanvasElement>;\r\n  private ctx!: CanvasRenderingContext2D;\r\n\r\n  ngOnInit() {\r\n    this.ctx = this.canvas.nativeElement.getContext('2d') as CanvasRenderingContext2D;\r\n    if (this.configs?.isImage) {\r\n      this.scanImage(this.configs);\r\n    }\r\n    if (this.configs?.isAuto) {\r\n      this.scanOCR(this.configs);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * scanOCR\r\n   * @param configs \r\n   * @param setting \r\n   */\r\n  public scanOCR(configs: Configs = this.configs, setting?: Function): AsyncSubject<any> {\r\n    // Reset rxjs\r\n    this.ngOnDestroy();\r\n    this.data$ = new BehaviorSubject({});\r\n    this.image$ = new BehaviorSubject({width: 0, height: 0});\r\n    this.logger$ = new BehaviorSubject({});\r\n    // OCR detector\r\n    const OCR_RUN = async (as: AsyncSubject<any>) => {\r\n      if (!this.configs?.isImage) {\r\n        await this.scanImage(this.configs);\r\n      }\r\n      const worker = await createWorker({ logger: m => this.logger$.next(m) }) as any;\r\n      await worker.load();\r\n      await worker.loadLanguage(configs?.languages?.join('+'));\r\n      await worker.initialize(configs?.languages?.join('+'));\r\n      setting && await setting(worker);\r\n      const { data } = await worker.recognize(configs?.src, configs?.options, configs?.output, configs?.jobId ?? worker.jobId);\r\n      await worker.terminate(configs?.jobId ?? worker.jobId);\r\n      this.createOverlay(data?.words, configs);\r\n      this.event.emit(data);\r\n      this.data$.next(data);\r\n      as.next(data);\r\n      as.complete();\r\n    }\r\n    const async = new AsyncSubject();\r\n    OCR_RUN(async);\r\n    return async;\r\n  }\r\n\r\n  /**\r\n   * scanImage\r\n   * @param configs \r\n   */\r\n  private async scanImage(configs: Configs): Promise<void> {\r\n    // Image full image\r\n    const image = await this.loadImage(configs) as CanvasImageSource;\r\n    this.canvas.nativeElement.width = (image as any).naturalWidth;\r\n    this.canvas.nativeElement.height = (image as any).naturalHeight;\r\n    // DrawImage\r\n    this.ctx.drawImage(image, 0, 0);\r\n    // Image element\r\n    this.image$.next({\r\n      width: this.canvas.nativeElement.width,\r\n      height: this.canvas.nativeElement.height\r\n    });\r\n  }\r\n\r\n  /**\r\n   * loadImage\r\n   * @param configs \r\n   * @returns \r\n   */\r\n  private async loadImage(configs: Configs): Promise<any> {\r\n    // Set the src of this Image object.\r\n    const image = new Image();\r\n    // Setting cross origin value to anonymous\r\n    image.setAttribute('crossOrigin', 'anonymous');\r\n     // When our image has loaded.\r\n    return new Promise(resolve => {\r\n      image.src = configs.src;\r\n      image.onload = () => resolve(image);\r\n    });\r\n  }\r\n\r\n  /**\r\n   * createOverlay\r\n   * @param words \r\n   * @param configs \r\n   */\r\n  private createOverlay(words: string[], configs: Configs): void {\r\n    words.forEach((w: any) => {\r\n      this.ctx.strokeStyle = configs.color;\r\n      this.ctx.strokeRect(w.bbox.x0, w.bbox.y0, w.bbox.x1 - w.bbox.x0, w.bbox.y1 - w.bbox.y0);\r\n    });\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.data$.complete();\r\n    this.image$.complete();\r\n    this.logger$.complete();\r\n  }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxScannerTextComponent } from './ngx-scanner-text.component';\r\n\r\n\r\n@NgModule({\r\n  declarations: [\r\n    NgxScannerTextComponent\r\n  ],\r\n  exports: [\r\n    NgxScannerTextComponent\r\n  ]\r\n})\r\nexport class NgxScannerTextModule { }\r\n","export interface Configs {\r\n  src: string;\r\n  color: string;\r\n  isAuto: boolean;\r\n  isImage: boolean;\r\n  languages: string[];\r\n  jobId?: string;\r\n  output?: Partial<OutputFormats>;\r\n  options?: Partial<RecognizeOptions>;\r\n};\r\n\r\nexport interface Scheduler {\r\n  addWorker(worker: Worker): string;\r\n  addJob(\r\n    action: 'recognize',\r\n    ...args: Parameters<Worker['recognize']>\r\n  ): Promise<RecognizeResult>;\r\n  addJob(\r\n    action: 'detect',\r\n    ...args: Parameters<Worker['detect']>\r\n  ): Promise<DetectResult>;\r\n  terminate(): Promise<any>;\r\n  getQueueLen(): number;\r\n  getNumWorkers(): number;\r\n}\r\n\r\nexport interface Worker {\r\n  load(jobId?: string): Promise<ConfigResult>;\r\n  writeText(path: string, text: string, jobId?: string): Promise<ConfigResult>;\r\n  readText(path: string, jobId?: string): Promise<ConfigResult>;\r\n  removeText(path: string, jobId?: string): Promise<ConfigResult>;\r\n  FS(method: string, args: any[], jobId?: string): Promise<ConfigResult>;\r\n  loadLanguage(langs?: string | Lang[], jobId?: string): Promise<ConfigResult>;\r\n  initialize(\r\n    langs?: string | Lang[],\r\n    oem?: OEM,\r\n    config?: string | Partial<InitOptions>,\r\n    jobId?: string\r\n  ): Promise<ConfigResult>;\r\n  setParameters(\r\n    params: Partial<WorkerParams>,\r\n    jobId?: string\r\n  ): Promise<ConfigResult>;\r\n  getImage(type: imageType): string;\r\n  recognize(\r\n    image: ImageLike,\r\n    options?: Partial<RecognizeOptions>,\r\n    output?: Partial<OutputFormats>,\r\n    jobId?: string\r\n  ): Promise<RecognizeResult>;\r\n  detect(image: ImageLike, jobId?: string): Promise<DetectResult>;\r\n  terminate(jobId?: string): Promise<ConfigResult>;\r\n  getPDF(\r\n    title?: string,\r\n    textonly?: boolean,\r\n    jobId?: string\r\n  ): Promise<GetPDFResult>;\r\n}\r\n\r\nexport interface Lang {\r\n  code: string;\r\n  data: unknown;\r\n}\r\n\r\nexport interface InitOptions {\r\n  load_system_dawg: string;\r\n  load_freq_dawg: string;\r\n  load_unambig_dawg: string;\r\n  load_punc_dawg: string;\r\n  load_number_dawg: string;\r\n  load_bigram_dawg: string;\r\n}\r\n\r\nexport type LoggerMessage = {\r\n  jobId: string;\r\n  progress: number;\r\n  status: string;\r\n  userJobId: string;\r\n  workerId: string;\r\n};\r\n\r\nexport interface WorkerOptions {\r\n  corePath: string;\r\n  langPath: string;\r\n  cachePath: string;\r\n  dataPath: string;\r\n  workerPath: string;\r\n  cacheMethod: string;\r\n  workerBlobURL: boolean;\r\n  gzip: boolean;\r\n  logger: (arg: LoggerMessage) => void;\r\n  errorHandler: (arg: any) => void;\r\n}\r\n\r\nexport interface WorkerParams {\r\n  tessedit_ocr_engine_mode: OEM;\r\n  tessedit_pageseg_mode: PSM;\r\n  tessedit_char_whitelist: string;\r\n  preserve_interword_spaces: string;\r\n  user_defined_dpi: string;\r\n  tessjs_create_hocr: string;\r\n  tessjs_create_tsv: string;\r\n  tessjs_create_box: string;\r\n  tessjs_create_unlv: string;\r\n  tessjs_create_osd: string;\r\n}\r\n\r\nexport interface OutputFormats {\r\n  text: boolean;\r\n  blocks: boolean;\r\n  layoutBlocks: boolean;\r\n  hocr: boolean;\r\n  tsv: boolean;\r\n  box: boolean;\r\n  unlv: boolean;\r\n  osd: boolean;\r\n  pdf: boolean;\r\n  imageColor: boolean;\r\n  imageGrey: boolean;\r\n  imageBinary: boolean;\r\n  debug: boolean;\r\n}\r\n\r\nexport interface RecognizeOptions {\r\n  rectangle: Rectangle;\r\n  pdfTitle: string;\r\n  pdfTextOnly: boolean;\r\n  rotateAuto: boolean;\r\n  rotateRadians: number;\r\n}\r\n\r\nexport interface ConfigResult {\r\n  jobId: string;\r\n  data: any;\r\n}\r\n\r\nexport interface RecognizeResult {\r\n  jobId: string;\r\n  data: Page;\r\n}\r\n\r\nexport interface GetPDFResult {\r\n  jobId: string;\r\n  data: number[];\r\n}\r\n\r\nexport interface DetectResult {\r\n  jobId: string;\r\n  data: DetectData;\r\n}\r\n\r\nexport interface DetectData {\r\n  tesseract_script_id: number | null;\r\n  script: string | null;\r\n  script_confidence: number | null;\r\n  orientation_degrees: number | null;\r\n  orientation_confidence: number | null;\r\n}\r\n\r\nexport interface Rectangle {\r\n  left: number;\r\n  top: number;\r\n  width: number;\r\n  height: number;\r\n}\r\n\r\nexport enum OEM {\r\n  TESSERACT_ONLY,\r\n  LSTM_ONLY,\r\n  TESSERACT_LSTM_COMBINED,\r\n  DEFAULT,\r\n}\r\n\r\nexport enum PSM {\r\n  OSD_ONLY = '0',\r\n  AUTO_OSD = '1',\r\n  AUTO_ONLY = '2',\r\n  AUTO = '3',\r\n  SINGLE_COLUMN = '4',\r\n  SINGLE_BLOCK_VERT_TEXT = '5',\r\n  SINGLE_BLOCK = '6',\r\n  SINGLE_LINE = '7',\r\n  SINGLE_WORD = '8',\r\n  CIRCLE_WORD = '9',\r\n  SINGLE_CHAR = '10',\r\n  SPARSE_TEXT = '11',\r\n  SPARSE_TEXT_OSD = '12',\r\n  RAW_LINE = '13',\r\n}\r\n\r\nexport const enum imageType {\r\n  COLOR = 0,\r\n  GREY = 1,\r\n  BINARY = 2,\r\n}\r\n\r\nexport type ImageLike =\r\n  | string\r\n  | HTMLImageElement\r\n  | HTMLCanvasElement\r\n  | HTMLVideoElement\r\n  | CanvasRenderingContext2D\r\n  | File\r\n  | Blob\r\n  | ImageData\r\n  | any;\r\n\r\nexport interface Block {\r\n  paragraphs: Paragraph[];\r\n  text: string;\r\n  confidence: number;\r\n  baseline: Baseline;\r\n  bbox: Bbox;\r\n  blocktype: string;\r\n  polygon: any;\r\n  page: Page;\r\n  lines: Line[];\r\n  words: Word[];\r\n  symbols: Symbol[];\r\n}\r\n\r\nexport interface Baseline {\r\n  x0: number;\r\n  y0: number;\r\n  x1: number;\r\n  y1: number;\r\n  has_baseline: boolean;\r\n}\r\n\r\nexport interface Bbox {\r\n  x0: number;\r\n  y0: number;\r\n  x1: number;\r\n  y1: number;\r\n}\r\n\r\nexport interface Line {\r\n  words: Word[];\r\n  text: string;\r\n  confidence: number;\r\n  baseline: Baseline;\r\n  bbox: Bbox;\r\n  paragraph: Paragraph;\r\n  block: Block;\r\n  page: Page;\r\n  symbols: Symbol[];\r\n}\r\n\r\nexport interface Paragraph {\r\n  lines: Line[];\r\n  text: string;\r\n  confidence: number;\r\n  baseline: Baseline;\r\n  bbox: Bbox;\r\n  is_ltr: boolean;\r\n  block: Block;\r\n  page: Page;\r\n  words: Word[];\r\n  symbols: Symbol[];\r\n}\r\n\r\nexport interface Symbol {\r\n  choices: Choice[];\r\n  image: any;\r\n  text: string;\r\n  confidence: number;\r\n  baseline: Baseline;\r\n  bbox: Bbox;\r\n  is_superscript: boolean;\r\n  is_subscript: boolean;\r\n  is_dropcap: boolean;\r\n  word: Word;\r\n  line: Line;\r\n  paragraph: Paragraph;\r\n  block: Block;\r\n  page: Page;\r\n}\r\n\r\nexport interface Choice {\r\n  text: string;\r\n  confidence: number;\r\n}\r\n\r\nexport interface Word {\r\n  symbols: Symbol[];\r\n  choices: Choice[];\r\n  text: string;\r\n  confidence: number;\r\n  baseline: Baseline;\r\n  bbox: Bbox;\r\n  is_numeric: boolean;\r\n  in_dictionary: boolean;\r\n  direction: string;\r\n  language: string;\r\n  is_bold: boolean;\r\n  is_italic: boolean;\r\n  is_underlined: boolean;\r\n  is_monospace: boolean;\r\n  is_serif: boolean;\r\n  is_smallcaps: boolean;\r\n  font_size: number;\r\n  font_id: number;\r\n  font_name: string;\r\n  line: Line;\r\n  paragraph: Paragraph;\r\n  block: Block;\r\n  page: Page;\r\n}\r\n\r\nexport interface Page {\r\n  blocks: Block[] | null;\r\n  confidence: number;\r\n  lines: Line[];\r\n  oem: string;\r\n  osd: string;\r\n  paragraphs: Paragraph[];\r\n  psm: string;\r\n  symbols: Symbol[];\r\n  text: string;\r\n  version: string;\r\n  words: Word[];\r\n  hocr: string | null;\r\n  tsv: string | null;\r\n  box: string | null;\r\n  unlv: string | null;\r\n  sd: string | null;\r\n  imageColor: string | null;\r\n  imageGrey: string | null;\r\n  imageBinary: string | null;\r\n  rotateRadians: number | null;\r\n  pdf: number[] | null;\r\n}\r\n","/*\r\n * Public API Surface of ngx-scanner-text\r\n */\r\n\r\nexport * from './lib/ngx-scanner-text.component';\r\nexport * from './lib/ngx-scanner-text.module';\r\nexport * from './lib/ngx-scanner-options.model';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}