Gathering detailed insights and metrics for ngx-scanner-text
Gathering detailed insights and metrics for ngx-scanner-text
Gathering detailed insights and metrics for ngx-scanner-text
Gathering detailed insights and metrics for ngx-scanner-text
This library is built to support optical character recognition (OCR) from images provided as urls. The core is based on Tesseract, supporting over 100 national languages worldwide.
npm install ngx-scanner-text
Typescript
Module System
Node Version
NPM Version
HTML (52.57%)
TypeScript (44.7%)
SCSS (2.73%)
Total Downloads
0
Last Day
0
Last Week
0
Last Month
0
Last Year
0
MIT License
1 Stars
1 Commits
2 Forks
3 Watchers
2 Branches
1 Contributors
Updated on Dec 16, 2024
Latest Version
1.1.0
Package Id
ngx-scanner-text@1.1.0
Unpacked Size
84.96 kB
Size
21.25 kB
File Count
15
NPM Version
9.5.1
Node Version
18.16.0
Published on
Jun 28, 2023
Cumulative downloads
Total Downloads
Last Day
0%
NaN
Compared to previous day
Last Week
0%
NaN
Compared to previous week
Last Month
0%
NaN
Compared to previous month
Last Year
0%
NaN
Compared to previous year
2
2
This library is built to support optical character recognition (OCR) from images provided as urls.
The core is based on Tesseract, supporting over 100 national languages worldwide.
This demo codesandbox, github.
npm install ngx-scanner-text@<version> --save
1import { NgxScannerTextModule } from "ngx-scanner-text"; 2 3@NgModule({ 4 imports: [NgxScannerTextModule], 5}) 6export class AppModule {}
1<ngx-scanner-text #scanner="scanner" [configs]="configs" (event)="onData($event)"></ngx-scanner-text> 2<button (click)="onScanOCR(scanner)">Scan</button> 3 4<textarea>{{ scanner?.logger$ | async | json }}</textarea> 5<textarea>{{ text }}</textarea>
1import { ChangeDetectorRef, Component } from "@angular/core"; 2import { NgxScannerTextComponent, Configs, Page } from "ngx-scanner-text"; 3 4@Component({ 5 selector: "app-root", 6 templateUrl: "./app.component.html", 7 styleUrls: ["./app.component.scss"] 8}) 9export class AppComponent { 10 public text: string; 11 12 public configs: Configs = { 13 src: 'https://raw.githubusercontent.com/id1945/ngx-scanner-text/master/ngx-scanner-text-origin.png', 14 languages: ['eng'], 15 color: 'red', 16 isAuto: true, 17 isImage: false, 18 options: { 19 rectangle: { 20 left: 70, 21 top: 100, 22 width: 700, 23 height: 200 24 } 25 } 26 }; 27 28 constructor(private cdf: ChangeDetectorRef) {} 29 30 onData(data: Page) { 31 this.text = data.text; 32 this.cdf.detectChanges(); 33 } 34 35 onScanOCR(scanner: NgxScannerTextComponent) { 36 scanner.scanOCR(this.configs).subscribe(console.log); 37 } 38}
1export interface Configs { 2 src: string; 3 color: string; 4 isAuto: boolean; 5 isImage: boolean; 6 languages: string[]; 7 jobId?: string; 8 output?: Partial<OutputFormats>; 9 options?: Partial<RecognizeOptions>; 10}; 11 12export interface Scheduler { 13 addWorker(worker: Worker): string; 14 addJob( 15 action: 'recognize', 16 ...args: Parameters<Worker['recognize']> 17 ): Promise<RecognizeResult>; 18 addJob( 19 action: 'detect', 20 ...args: Parameters<Worker['detect']> 21 ): Promise<DetectResult>; 22 terminate(): Promise<any>; 23 getQueueLen(): number; 24 getNumWorkers(): number; 25} 26 27export interface Worker { 28 load(jobId?: string): Promise<ConfigResult>; 29 writeText(path: string, text: string, jobId?: string): Promise<ConfigResult>; 30 readText(path: string, jobId?: string): Promise<ConfigResult>; 31 removeText(path: string, jobId?: string): Promise<ConfigResult>; 32 FS(method: string, args: any[], jobId?: string): Promise<ConfigResult>; 33 loadLanguage(langs?: string | Lang[], jobId?: string): Promise<ConfigResult>; 34 initialize( 35 langs?: string | Lang[], 36 oem?: OEM, 37 config?: string | Partial<InitOptions>, 38 jobId?: string 39 ): Promise<ConfigResult>; 40 setParameters( 41 params: Partial<WorkerParams>, 42 jobId?: string 43 ): Promise<ConfigResult>; 44 getImage(type: imageType): string; 45 recognize( 46 image: ImageLike, 47 options?: Partial<RecognizeOptions>, 48 output?: Partial<OutputFormats>, 49 jobId?: string 50 ): Promise<RecognizeResult>; 51 detect(image: ImageLike, jobId?: string): Promise<DetectResult>; 52 terminate(jobId?: string): Promise<ConfigResult>; 53 getPDF( 54 title?: string, 55 textonly?: boolean, 56 jobId?: string 57 ): Promise<GetPDFResult>; 58} 59 60export interface Lang { 61 code: string; 62 data: unknown; 63} 64 65export interface InitOptions { 66 load_system_dawg: string; 67 load_freq_dawg: string; 68 load_unambig_dawg: string; 69 load_punc_dawg: string; 70 load_number_dawg: string; 71 load_bigram_dawg: string; 72} 73 74export type LoggerMessage = { 75 jobId: string; 76 progress: number; 77 status: string; 78 userJobId: string; 79 workerId: string; 80}; 81 82export interface WorkerOptions { 83 corePath: string; 84 langPath: string; 85 cachePath: string; 86 dataPath: string; 87 workerPath: string; 88 cacheMethod: string; 89 workerBlobURL: boolean; 90 gzip: boolean; 91 logger: (arg: LoggerMessage) => void; 92 errorHandler: (arg: any) => void; 93} 94 95export interface WorkerParams { 96 tessedit_ocr_engine_mode: OEM; 97 tessedit_pageseg_mode: PSM; 98 tessedit_char_whitelist: string; 99 preserve_interword_spaces: string; 100 user_defined_dpi: string; 101 tessjs_create_hocr: string; 102 tessjs_create_tsv: string; 103 tessjs_create_box: string; 104 tessjs_create_unlv: string; 105 tessjs_create_osd: string; 106} 107 108export interface OutputFormats { 109 text: boolean; 110 blocks: boolean; 111 layoutBlocks: boolean; 112 hocr: boolean; 113 tsv: boolean; 114 box: boolean; 115 unlv: boolean; 116 osd: boolean; 117 pdf: boolean; 118 imageColor: boolean; 119 imageGrey: boolean; 120 imageBinary: boolean; 121 debug: boolean; 122} 123 124export interface RecognizeOptions { 125 rectangle: Rectangle; 126 pdfTitle: string; 127 pdfTextOnly: boolean; 128 rotateAuto: boolean; 129 rotateRadians: number; 130} 131 132export interface ConfigResult { 133 jobId: string; 134 data: any; 135} 136 137export interface RecognizeResult { 138 jobId: string; 139 data: Page; 140} 141 142export interface GetPDFResult { 143 jobId: string; 144 data: number[]; 145} 146 147export interface DetectResult { 148 jobId: string; 149 data: DetectData; 150} 151 152export interface DetectData { 153 tesseract_script_id: number | null; 154 script: string | null; 155 script_confidence: number | null; 156 orientation_degrees: number | null; 157 orientation_confidence: number | null; 158} 159 160export interface Rectangle { 161 left: number; 162 top: number; 163 width: number; 164 height: number; 165} 166 167export enum OEM { 168 TESSERACT_ONLY, 169 LSTM_ONLY, 170 TESSERACT_LSTM_COMBINED, 171 DEFAULT, 172} 173 174export enum PSM { 175 OSD_ONLY = '0', 176 AUTO_OSD = '1', 177 AUTO_ONLY = '2', 178 AUTO = '3', 179 SINGLE_COLUMN = '4', 180 SINGLE_BLOCK_VERT_TEXT = '5', 181 SINGLE_BLOCK = '6', 182 SINGLE_LINE = '7', 183 SINGLE_WORD = '8', 184 CIRCLE_WORD = '9', 185 SINGLE_CHAR = '10', 186 SPARSE_TEXT = '11', 187 SPARSE_TEXT_OSD = '12', 188 RAW_LINE = '13', 189} 190 191export const enum imageType { 192 COLOR = 0, 193 GREY = 1, 194 BINARY = 2, 195} 196 197export type ImageLike = 198 | string 199 | HTMLImageElement 200 | HTMLCanvasElement 201 | HTMLVideoElement 202 | CanvasRenderingContext2D 203 | File 204 | Blob 205 | ImageData 206 | any; 207 208export interface Block { 209 paragraphs: Paragraph[]; 210 text: string; 211 confidence: number; 212 baseline: Baseline; 213 bbox: Bbox; 214 blocktype: string; 215 polygon: any; 216 page: Page; 217 lines: Line[]; 218 words: Word[]; 219 symbols: Symbol[]; 220} 221 222export interface Baseline { 223 x0: number; 224 y0: number; 225 x1: number; 226 y1: number; 227 has_baseline: boolean; 228} 229 230export interface Bbox { 231 x0: number; 232 y0: number; 233 x1: number; 234 y1: number; 235} 236 237export interface Line { 238 words: Word[]; 239 text: string; 240 confidence: number; 241 baseline: Baseline; 242 bbox: Bbox; 243 paragraph: Paragraph; 244 block: Block; 245 page: Page; 246 symbols: Symbol[]; 247} 248 249export interface Paragraph { 250 lines: Line[]; 251 text: string; 252 confidence: number; 253 baseline: Baseline; 254 bbox: Bbox; 255 is_ltr: boolean; 256 block: Block; 257 page: Page; 258 words: Word[]; 259 symbols: Symbol[]; 260} 261 262export interface Symbol { 263 choices: Choice[]; 264 image: any; 265 text: string; 266 confidence: number; 267 baseline: Baseline; 268 bbox: Bbox; 269 is_superscript: boolean; 270 is_subscript: boolean; 271 is_dropcap: boolean; 272 word: Word; 273 line: Line; 274 paragraph: Paragraph; 275 block: Block; 276 page: Page; 277} 278 279export interface Choice { 280 text: string; 281 confidence: number; 282} 283 284export interface Word { 285 symbols: Symbol[]; 286 choices: Choice[]; 287 text: string; 288 confidence: number; 289 baseline: Baseline; 290 bbox: Bbox; 291 is_numeric: boolean; 292 in_dictionary: boolean; 293 direction: string; 294 language: string; 295 is_bold: boolean; 296 is_italic: boolean; 297 is_underlined: boolean; 298 is_monospace: boolean; 299 is_serif: boolean; 300 is_smallcaps: boolean; 301 font_size: number; 302 font_id: number; 303 font_name: string; 304 line: Line; 305 paragraph: Paragraph; 306 block: Block; 307 page: Page; 308} 309 310export interface Page { 311 blocks: Block[] | null; 312 confidence: number; 313 lines: Line[]; 314 oem: string; 315 osd: string; 316 paragraphs: Paragraph[]; 317 psm: string; 318 symbols: Symbol[]; 319 text: string; 320 version: string; 321 words: Word[]; 322 hocr: string | null; 323 tsv: string | null; 324 box: string | null; 325 unlv: string | null; 326 sd: string | null; 327 imageColor: string | null; 328 imageGrey: string | null; 329 imageBinary: string | null; 330 rotateRadians: number | null; 331 pdf: number[] | null; 332}
1[ 2 { 3 "name": "Afrikaans", 4 "code": "afr", 5 "dir": "ltr" 6 }, 7 { 8 "name": "Albanian", 9 "code": "qi", 10 "dir": "ltr" 11 }, 12 { 13 "name": "Amharic", 14 "code": "amh", 15 "dir": "rtl" 16 }, 17 { 18 "name": "Arabic", 19 "code": "ara", 20 "dir": "rtl" 21 }, 22 { 23 "name": "Armenian", 24 "code": "hye", 25 "dir": "ltr" 26 }, 27 { 28 "name": "Azerbaijani", 29 "code": "aze", 30 "dir": "ltr" 31 }, 32 { 33 "name": "Basque", 34 "code": "eus", 35 "dir": "ltr" 36 }, 37 { 38 "name": "Belarusian", 39 "code": "bel", 40 "dir": "ltr" 41 }, 42 { 43 "name": "Bengali", 44 "code": "ben", 45 "dir": "ltr" 46 }, 47 { 48 "name": "Bosnian", 49 "code": "bos", 50 "dir": "ltr" 51 }, 52 { 53 "name": "Bulgarian", 54 "code": "bul", 55 "dir": "ltr" 56 }, 57 { 58 "name": "Catalan", 59 "code": "cat", 60 "dir": "ltr" 61 }, 62 { 63 "name": "Cebuano", 64 "code": "ceb", 65 "dir": "ltr" 66 }, 67 { 68 "name": "Cherokee", 69 "code": "chr", 70 "dir": "ltr" 71 }, 72 { 73 "name": "Chinese (Simplified)", 74 "code": "chi_sim", 75 "dir": "ltr" 76 }, 77 { 78 "name": "Chinese (Traditional)", 79 "code": "chi_tra", 80 "dir": "ltr" 81 }, 82 { 83 "name": "Corsican", 84 "code": "cos", 85 "dir": "ltr" 86 }, 87 { 88 "name": "Croatian", 89 "code": "hrv", 90 "dir": "ltr" 91 }, 92 { 93 "name": "Czech", 94 "code": "ces", 95 "dir": "ltr" 96 }, 97 { 98 "name": "Danish", 99 "code": "dan", 100 "dir": "ltr" 101 }, 102 { 103 "name": "Dutch", 104 "code": "nld", 105 "dir": "ltr" 106 }, 107 { 108 "name": "English", 109 "code": "eng", 110 "dir": "ltr" 111 }, 112 { 113 "name": "Esperanto", 114 "code": "epo", 115 "dir": "ltr" 116 }, 117 { 118 "name": "Estonian", 119 "code": "est", 120 "dir": "ltr" 121 }, 122 { 123 "name": "Finnish", 124 "code": "fin", 125 "dir": "ltr" 126 }, 127 { 128 "name": "French", 129 "code": "fra", 130 "dir": "ltr" 131 }, 132 { 133 "name": "Frisian", 134 "code": "fry", 135 "dir": "ltr" 136 }, 137 { 138 "name": "Galician", 139 "code": "glg", 140 "dir": "ltr" 141 }, 142 { 143 "name": "Georgian", 144 "code": "kat", 145 "dir": "ltr" 146 }, 147 { 148 "name": "German", 149 "code": "deu", 150 "dir": "ltr" 151 }, 152 { 153 "name": "Greek", 154 "code": "ell", 155 "dir": "ltr" 156 }, 157 { 158 "name": "Gujarati", 159 "code": "guj", 160 "dir": "ltr" 161 }, 162 { 163 "name": "Haitian Creole", 164 "code": "hat", 165 "dir": "ltr" 166 }, 167 { 168 "name": "Hausa", 169 "code": "hau", 170 "dir": "rtl" 171 }, 172 { 173 "name": "Hebrew", 174 "code": "heb", 175 "dir": "rtl" 176 }, 177 { 178 "name": "Hindi", 179 "code": "hin", 180 "dir": "ltr" 181 }, 182 { 183 "name": "Hungarian", 184 "code": "hun", 185 "dir": "ltr" 186 }, 187 { 188 "name": "Icelandic", 189 "code": "isl", 190 "dir": "ltr" 191 }, 192 { 193 "name": "Igbo", 194 "code": "ibo", 195 "dir": "ltr" 196 }, 197 { 198 "name": "Indonesian", 199 "code": "ind", 200 "dir": "ltr" 201 }, 202 { 203 "name": "Irish", 204 "code": "gle", 205 "dir": "ltr" 206 }, 207 { 208 "name": "Italian", 209 "code": "ita", 210 "dir": "ltr" 211 }, 212 { 213 "name": "Japanese", 214 "code": "jpn", 215 "dir": "ltr" 216 }, 217 { 218 "name": "Javanese", 219 "code": "jav", 220 "dir": "ltr" 221 }, 222 { 223 "name": "Kannada", 224 "code": "kan", 225 "dir": "ltr" 226 }, 227 { 228 "name": "Kazakh", 229 "code": "kaz", 230 "dir": "ltr" 231 }, 232 { 233 "name": "Khmer", 234 "code": "khm", 235 "dir": "ltr" 236 }, 237 { 238 "name": "Kinyarwanda", 239 "code": "kin", 240 "dir": "ltr" 241 }, 242 { 243 "name": "Korean", 244 "code": "kor", 245 "dir": "ltr" 246 }, 247 { 248 "name": "Kurdish (Kurmanji)", 249 "code": "kur_ara", 250 "dir": "rtl" 251 }, 252 { 253 "name": "Kyrgyz", 254 "code": "kir", 255 "dir": "ltr" 256 }, 257 { 258 "name": "Lao", 259 "code": "lao", 260 "dir": "ltr" 261 }, 262 { 263 "name": "Latin", 264 "code": "lat", 265 "dir": "ltr" 266 }, 267 { 268 "name": "Latvian", 269 "code": "lav", 270 "dir": "ltr" 271 }, 272 { 273 "name": "Lithuanian", 274 "code": "lit", 275 "dir": "ltr" 276 }, 277 { 278 "name": "Luxembourgish", 279 "code": "ltz", 280 "dir": "ltr" 281 }, 282 { 283 "name": "Macedonian", 284 "code": "kd", 285 "dir": "ltr" 286 }, 287 { 288 "name": "Malagasy", 289 "code": "lg", 290 "dir": "ltr" 291 }, 292 { 293 "name": "Malay", 294 "code": "sa", 295 "dir": "ltr" 296 }, 297 { 298 "name": "Malayalam", 299 "code": "al", 300 "dir": "ltr" 301 }, 302 { 303 "name": "Maltese", 304 "code": "lt", 305 "dir": "ltr" 306 }, 307 { 308 "name": "Maori", 309 "code": "i", 310 "dir": "ltr" 311 }, 312 { 313 "name": "Marathi", 314 "code": "ar", 315 "dir": "ltr" 316 }, 317 { 318 "name": "Mongolian", 319 "code": "on", 320 "dir": "ltr" 321 }, 322 { 323 "name": "Myanmar (Burmese)", 324 "code": "ya", 325 "dir": "ltr" 326 }, 327 { 328 "name": "Nepali", 329 "code": "nep", 330 "dir": "ltr" 331 }, 332 { 333 "name": "Norwegian", 334 "code": "nor", 335 "dir": "ltr" 336 }, 337 { 338 "name": "Odia (Oriya)", 339 "code": "ori", 340 "dir": "ltr" 341 }, 342 { 343 "name": "Pashto", 344 "code": "pus", 345 "dir": "rtl" 346 }, 347 { 348 "name": "Persian", 349 "code": "fas", 350 "dir": "rtl" 351 }, 352 { 353 "name": "Polish", 354 "code": "pol", 355 "dir": "ltr" 356 }, 357 { 358 "name": "Portuguese", 359 "code": "por", 360 "dir": "ltr" 361 }, 362 { 363 "name": "Punjabi", 364 "code": "pan", 365 "dir": "ltr" 366 }, 367 { 368 "name": "Romanian", 369 "code": "ron", 370 "dir": "ltr" 371 }, 372 { 373 "name": "Russian", 374 "code": "rus", 375 "dir": "ltr" 376 }, 377 { 378 "name": "Samoan", 379 "code": "mo", 380 "dir": "ltr" 381 }, 382 { 383 "name": "Scots Gaelic", 384 "code": "gla", 385 "dir": "ltr" 386 }, 387 { 388 "name": "Serbian", 389 "code": "rp", 390 "dir": "ltr" 391 }, 392 { 393 "name": "Sesotho", 394 "code": "ot", 395 "dir": "ltr" 396 }, 397 { 398 "name": "Shona", 399 "code": "na", 400 "dir": "ltr" 401 }, 402 { 403 "name": "Sindhi", 404 "code": "d", 405 "dir": "rtl" 406 }, 407 { 408 "name": "Sinhala (Sinhalese)", 409 "code": "in", 410 "dir": "in" 411 }, 412 { 413 "name": "Slovak", 414 "code": "k", 415 "dir": "ltr" 416 }, 417 { 418 "name": "Slovenian", 419 "code": "l", 420 "dir": "ltr" 421 }, 422 { 423 "name": "Somali", 424 "code": "o", 425 "dir": "ltr" 426 }, 427 { 428 "name": "Spanish", 429 "code": "pa", 430 "dir": "ltr" 431 }, 432 { 433 "name": "Sundanese", 434 "code": "u", 435 "dir": "ltr" 436 }, 437 { 438 "name": "Swahili", 439 "code": "wa", 440 "dir": "ltr" 441 }, 442 { 443 "name": "Swedish", 444 "code": "we", 445 "dir": "ltr" 446 }, 447 { 448 "name": "Tajik", 449 "code": "tg", 450 "dir": "ltr" 451 }, 452 { 453 "name": "Tamil", 454 "code": "ta", 455 "dir": "ltr" 456 }, 457 { 458 "name": "Tatar", 459 "code": "tt", 460 "dir": "ltr" 461 }, 462 { 463 "name": "Telugu", 464 "code": "te", 465 "dir": "ltr" 466 }, 467 { 468 "name": "Thai", 469 "code": "th", 470 "dir": "ltr" 471 }, 472 { 473 "name": "Turkish", 474 "code": "tur", 475 "dir": "ltr" 476 }, 477 { 478 "name": "Ukrainian", 479 "code": "ukr", 480 "dir": "ltr" 481 }, 482 { 483 "name": "Urdu", 484 "code": "urd", 485 "dir": "rtl" 486 }, 487 { 488 "name": "Uzbek", 489 "code": "uzb", 490 "dir": "ltr" 491 }, 492 { 493 "name": "Vietnamese", 494 "code": "vie", 495 "dir": "ltr" 496 }, 497 { 498 "name": "Welsh", 499 "code": "cym", 500 "dir": "ltr" 501 }, 502 { 503 "name": "Xhosa", 504 "code": "xho", 505 "dir": "ltr" 506 }, 507 { 508 "name": "Yiddish", 509 "code": "yi", 510 "dir": "rtl" 511 }, 512 { 513 "name": "Yoruba", 514 "code": "yo", 515 "dir": "ltr" 516 }, 517 { 518 "name": "Zulu", 519 "code": "zu", 520 "dir": "ltr" 521 } 522]
Note that the `dir` property indicates the direction of the language,
where `ltr` means left-to-right and `rtl` means right-to-left.
Field | Description | Type | Default |
---|---|---|---|
[configs] | config | Configs | {} |
Field | Description | Type | Default |
---|---|---|---|
(event) | result data | BehaviorSubject | {} |
Field | Description | Type | Default |
---|---|---|---|
data$ | result data | BehaviorSubject | {} |
logger$ | status | BehaviorSubject | {} |
image$ | actual photo size | BehaviorSubject | {width: 0, height: 0} |
Support versions | |
---|---|
Angular 16 | 1.1.0 |
Angular 14 | 1.0.9 |
Author Information | |
---|---|
Author | DaiDH |
Phone | +84845882882 |
Country | Vietnam |
Bitcoin |
---|
![]() |
MIT License Copyright (c) 2022 DaiDH
No vulnerabilities found.
No security vulnerabilities found.