id-scanner-lib 1.3.3 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -460
- package/dist/id-scanner-lib.esm.js +4641 -0
- package/dist/id-scanner-lib.esm.js.map +1 -0
- package/dist/id-scanner-lib.js +14755 -0
- package/dist/id-scanner-lib.js.map +1 -0
- package/dist/types/core/base-module.d.ts +44 -0
- package/dist/types/core/camera-manager.d.ts +258 -0
- package/dist/types/core/config.d.ts +88 -0
- package/dist/types/core/errors.d.ts +111 -0
- package/dist/types/core/event-emitter.d.ts +55 -0
- package/dist/types/core/logger.d.ts +277 -0
- package/dist/types/core/module-manager.d.ts +78 -0
- package/dist/types/core/plugin-manager.d.ts +158 -0
- package/dist/types/core/resource-manager.d.ts +246 -0
- package/dist/types/core/result.d.ts +83 -0
- package/dist/types/core/scanner-factory.d.ts +93 -0
- package/dist/types/index.bundle.d.ts +1303 -0
- package/dist/types/index.d.ts +86 -0
- package/dist/types/interfaces/external-types.d.ts +174 -0
- package/dist/types/interfaces/face-detection.d.ts +293 -0
- package/dist/types/interfaces/scanner-module.d.ts +280 -0
- package/dist/types/modules/face/face-detector.d.ts +170 -0
- package/dist/types/modules/face/index.d.ts +56 -0
- package/dist/types/modules/face/liveness-detector.d.ts +177 -0
- package/dist/types/modules/face/types.d.ts +136 -0
- package/dist/types/modules/id-card/anti-fake-detector.d.ts +170 -0
- package/dist/types/modules/id-card/id-card-detector.d.ts +131 -0
- package/dist/types/modules/id-card/index.d.ts +89 -0
- package/dist/types/modules/id-card/ocr-processor.d.ts +110 -0
- package/dist/types/modules/id-card/ocr-worker.d.ts +31 -0
- package/dist/types/modules/id-card/types.d.ts +181 -0
- package/dist/types/modules/qrcode/index.d.ts +51 -0
- package/dist/types/modules/qrcode/qr-code-scanner.d.ts +64 -0
- package/dist/types/modules/qrcode/types.d.ts +67 -0
- package/dist/types/utils/camera.d.ts +81 -0
- package/dist/types/utils/image-processing.d.ts +176 -0
- package/dist/types/utils/index.d.ts +175 -0
- package/dist/types/utils/performance.d.ts +81 -0
- package/dist/types/utils/resource-manager.d.ts +53 -0
- package/dist/types/utils/types.d.ts +166 -0
- package/dist/types/utils/worker.d.ts +52 -0
- package/dist/types/version.d.ts +7 -0
- package/package.json +76 -75
- package/src/core/base-module.ts +78 -0
- package/src/core/camera-manager.ts +798 -0
- package/src/core/config.ts +268 -0
- package/src/core/errors.ts +174 -0
- package/src/core/event-emitter.ts +110 -0
- package/src/core/logger.ts +549 -0
- package/src/core/module-manager.ts +165 -0
- package/src/core/plugin-manager.ts +429 -0
- package/src/core/resource-manager.ts +762 -0
- package/src/core/result.ts +163 -0
- package/src/core/scanner-factory.ts +237 -0
- package/src/index.ts +113 -936
- package/src/interfaces/external-types.ts +200 -0
- package/src/interfaces/face-detection.ts +309 -0
- package/src/interfaces/scanner-module.ts +384 -0
- package/src/modules/face/face-detector.ts +931 -0
- package/src/modules/face/index.ts +208 -0
- package/src/modules/face/liveness-detector.ts +908 -0
- package/src/modules/face/types.ts +133 -0
- package/src/{id-recognition → modules/id-card}/anti-fake-detector.ts +273 -239
- package/src/modules/id-card/id-card-detector.ts +474 -0
- package/src/modules/id-card/index.ts +425 -0
- package/src/{id-recognition → modules/id-card}/ocr-processor.ts +149 -92
- package/src/modules/id-card/ocr-worker.ts +259 -0
- package/src/modules/id-card/types.ts +178 -0
- package/src/modules/qrcode/index.ts +175 -0
- package/src/modules/qrcode/qr-code-scanner.ts +230 -0
- package/src/modules/qrcode/types.ts +65 -0
- package/src/types/tesseract.d.ts +265 -22
- package/src/utils/image-processing.ts +68 -49
- package/src/utils/index.ts +426 -0
- package/src/utils/performance.ts +168 -131
- package/src/utils/resource-manager.ts +65 -146
- package/src/utils/types.ts +90 -2
- package/src/utils/worker.ts +123 -84
- package/src/version.ts +11 -0
- package/tools/scaffold.js +543 -0
- package/dist/id-scanner-core.esm.js +0 -11349
- package/dist/id-scanner-core.js +0 -11361
- package/dist/id-scanner-core.min.js +0 -1
- package/dist/id-scanner-ocr.esm.js +0 -2319
- package/dist/id-scanner-ocr.js +0 -2328
- package/dist/id-scanner-ocr.min.js +0 -1
- package/dist/id-scanner-qr.esm.js +0 -1296
- package/dist/id-scanner-qr.js +0 -1305
- package/dist/id-scanner-qr.min.js +0 -1
- package/dist/id-scanner.js +0 -4561
- package/dist/id-scanner.min.js +0 -1
- package/src/core.ts +0 -138
- package/src/demo/demo.ts +0 -204
- package/src/id-recognition/data-extractor.ts +0 -262
- package/src/id-recognition/id-detector.ts +0 -510
- package/src/id-recognition/ocr-worker.ts +0 -156
- package/src/index-umd.ts +0 -477
- package/src/ocr-module.ts +0 -187
- package/src/qr-module.ts +0 -179
- package/src/scanner/barcode-scanner.ts +0 -251
- package/src/scanner/qr-scanner.ts +0 -167
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file 数据提取工具类
|
|
3
|
-
* @description 提供身份证信息的验证和格式化功能
|
|
4
|
-
* @module DataExtractor
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { IDCardInfo } from '../utils/types';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* 数据提取工具类
|
|
11
|
-
*
|
|
12
|
-
* 提供身份证信息的验证、提取和增强功能,可以从身份证号码中提取出生日期、性别等信息,
|
|
13
|
-
* 并对OCR识别结果进行补充和验证
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```typescript
|
|
17
|
-
* // 验证身份证号码
|
|
18
|
-
* const isValid = DataExtractor.validateIDNumber('110101199001011234');
|
|
19
|
-
*
|
|
20
|
-
* // 从身份证号码提取出生日期
|
|
21
|
-
* const birthDate = DataExtractor.extractBirthDateFromID('110101199001011234');
|
|
22
|
-
* // 结果: '1990-01-01'
|
|
23
|
-
*
|
|
24
|
-
* // 增强OCR识别结果
|
|
25
|
-
* const enhancedInfo = DataExtractor.enhanceIDCardInfo({
|
|
26
|
-
* name: '张三',
|
|
27
|
-
* idNumber: '110101199001011234'
|
|
28
|
-
* });
|
|
29
|
-
* // 结果会自动补充性别和出生日期
|
|
30
|
-
* ```
|
|
31
|
-
*/
|
|
32
|
-
export class DataExtractor {
|
|
33
|
-
/**
|
|
34
|
-
* 验证身份证号码格式
|
|
35
|
-
*
|
|
36
|
-
* 检查身份证号码的长度、格式和出生日期部分是否有效
|
|
37
|
-
*
|
|
38
|
-
* @param {string} idNumber - 要验证的身份证号码
|
|
39
|
-
* @returns {boolean} 是否是有效的身份证号码
|
|
40
|
-
*/
|
|
41
|
-
static validateIDNumber(idNumber: string): boolean {
|
|
42
|
-
// 简单校验长度
|
|
43
|
-
if (!idNumber || idNumber.length !== 18) {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// 校验格式 (前17位必须是数字,最后一位可以是数字或X)
|
|
48
|
-
const pattern = /^\d{17}[\dX]$/;
|
|
49
|
-
if (!pattern.test(idNumber)) {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
// 校验出生日期
|
|
54
|
-
const year = parseInt(idNumber.substr(6, 4));
|
|
55
|
-
const month = parseInt(idNumber.substr(10, 2));
|
|
56
|
-
const day = parseInt(idNumber.substr(12, 2));
|
|
57
|
-
|
|
58
|
-
const date = new Date(year, month - 1, day);
|
|
59
|
-
if (
|
|
60
|
-
date.getFullYear() !== year ||
|
|
61
|
-
date.getMonth() + 1 !== month ||
|
|
62
|
-
date.getDate() !== day
|
|
63
|
-
) {
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// 简单的校验规则,实际项目中可以加入更完善的验证
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* 从身份证号码提取出生日期
|
|
73
|
-
*
|
|
74
|
-
* @param {string} idNumber - 身份证号码
|
|
75
|
-
* @returns {string|null} 格式化的出生日期(YYYY-MM-DD),如果身份证号码无效则返回null
|
|
76
|
-
*/
|
|
77
|
-
static extractBirthDateFromID(idNumber: string): string | null {
|
|
78
|
-
if (!this.validateIDNumber(idNumber)) {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
const year = idNumber.substr(6, 4);
|
|
83
|
-
const month = idNumber.substr(10, 2);
|
|
84
|
-
const day = idNumber.substr(12, 2);
|
|
85
|
-
|
|
86
|
-
return `${year}-${month}-${day}`;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* 从身份证号码提取性别
|
|
91
|
-
*
|
|
92
|
-
* 根据身份证号码第17位判断性别,奇数为男,偶数为女
|
|
93
|
-
*
|
|
94
|
-
* @param {string} idNumber - 身份证号码
|
|
95
|
-
* @returns {string|null} '男'或'女',如果身份证号码无效则返回null
|
|
96
|
-
*/
|
|
97
|
-
static extractGenderFromID(idNumber: string): string | null {
|
|
98
|
-
if (!this.validateIDNumber(idNumber)) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// 第17位,奇数为男,偶数为女
|
|
103
|
-
const genderCode = parseInt(idNumber.charAt(16));
|
|
104
|
-
return genderCode % 2 === 1 ? '男' : '女';
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* 从身份证号码提取地区编码
|
|
109
|
-
*
|
|
110
|
-
* @param {string} idNumber - 身份证号码
|
|
111
|
-
* @returns {string|null} 地区编码(前6位),如果身份证号码无效则返回null
|
|
112
|
-
*/
|
|
113
|
-
static extractRegionFromID(idNumber: string): string | null {
|
|
114
|
-
if (!this.validateIDNumber(idNumber)) {
|
|
115
|
-
return null;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return idNumber.substr(0, 6);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/**
|
|
122
|
-
* 合并并优化身份证信息
|
|
123
|
-
*
|
|
124
|
-
* 使用多个来源的数据进行交叉验证和补充,如果OCR识别结果缺少某些信息,
|
|
125
|
-
* 但有身份证号码,则可以从号码中提取出生日期和性别等信息
|
|
126
|
-
*
|
|
127
|
-
* @param {IDCardInfo} ocrInfo - OCR识别到的身份证信息
|
|
128
|
-
* @param {string} [idNumber] - 可选的外部提供的身份证号码,优先级高于OCR识别结果
|
|
129
|
-
* @returns {IDCardInfo} 增强后的身份证信息
|
|
130
|
-
*/
|
|
131
|
-
static enhanceIDCardInfo(ocrInfo: IDCardInfo, idNumber?: string): IDCardInfo {
|
|
132
|
-
const result = { ...ocrInfo };
|
|
133
|
-
|
|
134
|
-
// 如果OCR识别出身份证号,但没有识别出生日期或性别,则从身份证号码提取
|
|
135
|
-
if (result.idNumber && this.validateIDNumber(result.idNumber)) {
|
|
136
|
-
// 从身份证号提取出生日期
|
|
137
|
-
if (!result.birthDate) {
|
|
138
|
-
result.birthDate = this.extractBirthDateFromID(result.idNumber) || undefined;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// 从身份证号提取性别
|
|
142
|
-
if (!result.gender) {
|
|
143
|
-
result.gender = this.extractGenderFromID(result.idNumber) || undefined;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// 如果外部传入了身份证号,则优先使用它并提取信息
|
|
148
|
-
if (idNumber && this.validateIDNumber(idNumber)) {
|
|
149
|
-
result.idNumber = idNumber;
|
|
150
|
-
|
|
151
|
-
// 使用身份证号码再次验证或补充信息
|
|
152
|
-
const birthDate = this.extractBirthDateFromID(idNumber);
|
|
153
|
-
if (birthDate) {
|
|
154
|
-
result.birthDate = birthDate;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
const gender = this.extractGenderFromID(idNumber);
|
|
158
|
-
if (gender) {
|
|
159
|
-
result.gender = gender;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
return result;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
/**
|
|
167
|
-
* 提取并验证身份证信息
|
|
168
|
-
*
|
|
169
|
-
* @param idCardInfo 初步提取的身份证信息
|
|
170
|
-
* @returns 验证和增强后的身份证信息
|
|
171
|
-
*/
|
|
172
|
-
extractAndValidate(idCardInfo: IDCardInfo): IDCardInfo {
|
|
173
|
-
const enhancedInfo = {...idCardInfo};
|
|
174
|
-
|
|
175
|
-
// 验证和规范化身份证号
|
|
176
|
-
if (enhancedInfo.idNumber) {
|
|
177
|
-
enhancedInfo.idNumber = this.normalizeIDNumber(enhancedInfo.idNumber);
|
|
178
|
-
|
|
179
|
-
// 如果身份证号有效,推断出生日期
|
|
180
|
-
if (this.validateIDNumber(enhancedInfo.idNumber)) {
|
|
181
|
-
if (!enhancedInfo.birthDate) {
|
|
182
|
-
enhancedInfo.birthDate = this.extractBirthDateFromID(enhancedInfo.idNumber);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// 推断性别
|
|
186
|
-
if (!enhancedInfo.gender) {
|
|
187
|
-
enhancedInfo.gender = this.extractGenderFromID(enhancedInfo.idNumber);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// 规范化日期格式
|
|
193
|
-
if (enhancedInfo.birthDate) {
|
|
194
|
-
enhancedInfo.birthDate = this.normalizeDate(enhancedInfo.birthDate);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
// 规范化地址信息
|
|
198
|
-
if (enhancedInfo.address) {
|
|
199
|
-
enhancedInfo.address = this.normalizeAddress(enhancedInfo.address);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
return enhancedInfo;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* 规范化身份证号码
|
|
207
|
-
*/
|
|
208
|
-
private normalizeIDNumber(idNumber: string): string {
|
|
209
|
-
// 移除空格和特殊字符
|
|
210
|
-
return idNumber.replace(/[\s\-]/g, '').toUpperCase();
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* 验证身份证号码是否有效
|
|
215
|
-
*/
|
|
216
|
-
private validateIDNumber(idNumber: string): boolean {
|
|
217
|
-
// 简单验证身份证号码长度和格式
|
|
218
|
-
const idRegex = /(^\d{15}$)|(^\d{17}([0-9]|X)$)/;
|
|
219
|
-
return idRegex.test(idNumber);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/**
|
|
223
|
-
* 从身份证号中提取出生日期
|
|
224
|
-
*/
|
|
225
|
-
private extractBirthDateFromID(idNumber: string): string {
|
|
226
|
-
if (idNumber.length === 18) {
|
|
227
|
-
return `${idNumber.substring(6, 10)}-${idNumber.substring(10, 12)}-${idNumber.substring(12, 14)}`;
|
|
228
|
-
} else if (idNumber.length === 15) {
|
|
229
|
-
return `19${idNumber.substring(6, 8)}-${idNumber.substring(8, 10)}-${idNumber.substring(10, 12)}`;
|
|
230
|
-
}
|
|
231
|
-
return '';
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* 从身份证号中提取性别信息
|
|
236
|
-
*/
|
|
237
|
-
private extractGenderFromID(idNumber: string): string {
|
|
238
|
-
let sexCode: number;
|
|
239
|
-
if (idNumber.length === 18) {
|
|
240
|
-
sexCode = parseInt(idNumber.charAt(16));
|
|
241
|
-
} else {
|
|
242
|
-
sexCode = parseInt(idNumber.charAt(14));
|
|
243
|
-
}
|
|
244
|
-
return sexCode % 2 === 1 ? '男' : '女';
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
/**
|
|
248
|
-
* 规范化日期格式
|
|
249
|
-
*/
|
|
250
|
-
private normalizeDate(date: string): string {
|
|
251
|
-
// 简单的日期格式化逻辑
|
|
252
|
-
return date.replace(/(\d{4})(\d{2})(\d{2})/, '$1-$2-$3');
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* 规范化地址信息
|
|
257
|
-
*/
|
|
258
|
-
private normalizeAddress(address: string): string {
|
|
259
|
-
// 地址格式化逻辑
|
|
260
|
-
return address.trim();
|
|
261
|
-
}
|
|
262
|
-
}
|