react-native-document-processor 0.1.0 → 0.2.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 CHANGED
@@ -1,128 +1,139 @@
1
1
  # react-native-document-processor
2
2
 
3
- Phiên bản **0.1.0** — thư viện React Native chụp tài liệu, tạo PDF và đọc QR/barcode
4
- bằng native. Được phát triển cho luồng giấy tờ của 24hMoney.
3
+ Phiên bản **0.2.0** — thư viện React Native chụp tài liệu, tạo PDF từ ảnh và đọc
4
+ QR/barcode bằng native trên iOS và Android.
5
5
 
6
- Repository: [quocvu12345/react-native-document-processor](https://github.com/quocvu12345/react-native-document-processor).
6
+ - [Repository](https://github.com/quocvu12345/react-native-document-processor)
7
+ - [Package npm](https://www.npmjs.com/package/react-native-document-processor)
8
+ - Source của phiên bản này: tag `v0.2.0`.
7
9
 
8
- ## Cài bằng npm hoặc Yarn
10
+ ## Cài đặt
9
11
 
10
12
  ```sh
11
- yarn add react-native-document-processor@0.1.0 --exact
12
- # Hoặc: npm install react-native-document-processor@0.1.0 --save-exact
13
+ yarn add react-native-document-processor@0.2.0 --exact
14
+ # Hoặc: npm install react-native-document-processor@0.2.0 --save-exact
13
15
  pod install --project-directory=ios
14
16
  ```
15
17
 
16
- Package: [react-native-document-processor trên npm](https://www.npmjs.com/package/react-native-document-processor).
17
- Source native của phiên bản này cũng có ở tag GitHub `v0.1.0`.
18
-
19
18
  Yêu cầu Android API 28+, iOS 15.1+ và React Native có autolinking. Đã kiểm tra
20
- trong ứng dụng React Native 0.83. Camera Android dùng Google Play services;
21
- ML Kit barcode model được đóng gói sẵn trong app. iOS cần khai báo
19
+ trong ứng dụng host dùng React Native 0.83. Camera Android cần Google Play services;
20
+ model ML Kit đọc barcode được đóng gói sẵn. iOS cần khai báo
22
21
  `NSCameraUsageDescription` trong `Info.plist` của ứng dụng.
23
22
 
24
- Metadata giấy phép hiện giữ nguyên `UNLICENSED`.
23
+ Rebuild native app sau khi cài hoặc nâng cấp thư viện. Reload JavaScript hoặc
24
+ cập nhật OTA không thêm được native module vào binary đã cài. Thư viện cần
25
+ native build riêng, chẳng hạn Expo development build.
25
26
 
26
- ## Luồng xử lý
27
+ Metadata giấy phép hiện là `UNLICENSED`.
27
28
 
28
- `scanDocument` của chính module này mở camera native: VisionKit trên iOS và
29
- ML Kit Document Scanner trên Android, có phát hiện biên, crop và xác nhận ảnh.
30
- Đã thay thế và gỡ `react-native-document-scanner-plugin` cùng
31
- `react-native-images-to-pdf`. Sau khi người dùng hoàn tất chụp:
29
+ ## Thay đổi trong 0.2.0
32
30
 
33
- ```text
34
- Ảnh đã scan
35
- → native decode + chuẩn hóa hướng EXIF
36
- → đọc QR trên bitmap
37
- → tạo preview nhỏ + ghi trang PDF từ cùng bitmap
38
- → trả PDF URI + mã QR + số trang về JS
39
- → đối chiếu mã giấy tờ và upload PDF bằng logic hiện có
40
- ```
41
-
42
- Mỗi trang cần một lời gọi `appendPage`; bắt đầu, hoàn tất và giải phóng session
43
- có ba lời gọi riêng. Không truyền bitmap/base64 qua bridge, không ghi ảnh crop
44
- hoặc ảnh resize trung gian, không render lại PDF để đọc QR. Các trang xử lý tuần
45
- tự trên worker riêng. Android ghi JPEG trực tiếp vào PDF và chỉ giữ metadata của
46
- các trang đã xong; iOS dùng Core Graphics PDF context và autorelease pool từng trang.
47
-
48
- - iOS: Vision chỉ đọc QR, ImageIO decode ảnh, Core Graphics tạo PDF.
49
- - Android: ML Kit barcode-scanning **bundled** 17.3.0 chỉ đọc QR, ImageDecoder
50
- chuẩn hóa EXIF, `JpegPdfWriter` ghi PDF image-only; camera dùng
51
- play-services-mlkit-document-scanner 16.0.0 và chỉ yêu cầu JPEG.
52
- - Đọc ảnh tối đa 4096 px cạnh dài trước khi encode PDF; PDF tối đa 3000 px,
53
- JPEG 92%; preview tối đa 1000 px, JPEG 85%. Không upscale ảnh nhỏ.
54
- - Khi chưa thấy payload `doc|...|<số>`, thử bốn vùng chồng lấn 60% trong RAM như
55
- chiến lược cũ. JS vẫn là nơi parse, giữ số 0 đầu, gộp mã trùng, đối chiếu mã
56
- thiếu/thừa và giữ các trang xuất hiện của từng mã.
57
- - Lỗi đọc QR được trả bằng trạng thái trang `error`; lỗi decode ảnh hoặc ghi PDF
58
- làm hủy cả session để tránh upload một PDF thiếu trang.
59
- - Preview là tùy chọn; lỗi tạo preview không làm mất mã QR đã đọc được.
60
-
61
- ## Phát triển trong ứng dụng 24hMoney
62
-
63
- Root `package.json` dùng phiên bản registry `0.1.0`. Expo/React Native autolinking
64
- nhận cả podspec iOS và package Android.
65
-
66
- ```sh
67
- yarn install
68
- pod install --project-directory=ios
69
- ```
31
+ - Sửa lỗi không đọc được QR trên iOS Simulator khi Vision không tạo được
32
+ inference context: yêu cầu chỉ đọc QR sử dụng Vision revision 1 trên Simulator.
33
+ - Thiết bị iOS thật tiếp tục dùng revision mặc định. API JavaScript giữ nguyên.
34
+ - Bản sửa được đóng gói trực tiếp trong source native của npm.
70
35
 
71
- Sau đó rebuild native app bằng cấu hình development đang dùng. Reload JS/OTA
72
- không bổ sung được native module vào binary cũ. `FileUploadHelper` luôn dùng module
73
- mới cho camera và tạo PDF; không còn fallback sang hai thư viện đã gỡ. Cần phát
74
- hành binary mới và quản lý runtime OTA phù hợp khi triển khai thay đổi này.
36
+ ## Chụp tài liệu và tạo PDF
75
37
 
76
- Source phát triển vẫn nằm trong `node_modules_dev/react-native-document-processor`.
77
- Khi cần thử thay đổi local, có thể tạm dùng dependency `file:`; trước khi phát hành
78
- app cần quay lại phiên bản registry đã publish và rebuild native.
38
+ `scanDocument` mở camera native: VisionKit trên iOS và ML Kit Document Scanner
39
+ trên Android. Người dùng có thể phát hiện biên, crop và xác nhận các trang.
79
40
 
80
41
  ```ts
81
- import { processDocumentImages, scanDocument } from 'react-native-document-processor';
42
+ import {
43
+ processDocumentImages,
44
+ scanDocument,
45
+ } from 'react-native-document-processor';
46
+ import RNFS from 'react-native-fs';
82
47
 
83
48
  const capture = await scanDocument({ croppedImageQuality: 100 });
84
49
  if (capture.status === 'cancel') return;
85
- const output = await processDocumentImages(capture.scannedImages, {
86
- onProgress: (completed, total) => updateProgress(completed, total),
87
- isCancelled: () => hasLeftScreen,
88
- });
89
- // output.pdfUri: PDF để upload
90
- // output.pages: QR, trạng thái và preview của từng trang (đánh số từ 1)
91
- // output.directoryUri: caller sở hữu sau khi thành công
92
- // capture.scannedImages: caller cũng phải xóa sau khi dùng xong
50
+
51
+ let output: Awaited<ReturnType<typeof processDocumentImages>> | undefined;
52
+ try {
53
+ output = await processDocumentImages(capture.scannedImages, {
54
+ onProgress: (completed, total) => updateProgress(completed, total),
55
+ isCancelled: () => hasLeftScreen,
56
+ });
57
+ // output.pdfUri: PDF để lưu hoặc upload
58
+ // output.pages: mã QR, trạng thái và preview của từng trang
59
+ // output.directoryUri: thư mục chứa PDF và preview, do caller sở hữu
60
+ await consumeDocument(output);
61
+ } finally {
62
+ // Chỉ dọn output sau khi mọi thao tác lưu/upload/hiển thị đã hoàn tất.
63
+ const temporaryPaths = [
64
+ ...capture.scannedImages,
65
+ ...(output ? [output.directoryUri] : []),
66
+ ];
67
+ await Promise.all(
68
+ temporaryPaths.map(path => RNFS.unlink(path).catch(() => undefined)),
69
+ );
70
+ }
71
+ ```
72
+
73
+ `updateProgress`, `hasLeftScreen` và `consumeDocument` là logic của ứng dụng host.
74
+ Ví dụ dùng `react-native-fs` để dọn file; thư viện này không phải dependency của
75
+ package và có thể được thay bằng API filesystem của ứng dụng.
76
+
77
+ `croppedImageQuality` nhận giá trị từ 0 đến 100; Android giữ JPEG gốc của scanner.
78
+ Mỗi lần chụp trả về `{ status: 'success' | 'cancel', scannedImages: string[] }`.
79
+ iOS trả tối đa 24 trang trong một lần chụp. Ứng dụng có thể gọi lại camera và gộp
80
+ các ảnh theo thứ tự trước khi tạo PDF.
81
+
82
+ `processDocumentImages` trả về các trang đánh số từ 1:
83
+
84
+ ```ts
85
+ {
86
+ pdfUri: 'file:///cache/session/document.pdf',
87
+ directoryUri: 'file:///cache/session',
88
+ pages: [
89
+ {
90
+ page: 1,
91
+ rawValues: ['doc|d|0030358'],
92
+ status: 'decoded', // 'decoded' | 'not-detected' | 'error'
93
+ previewUri: 'file:///cache/session/page-1.jpg', // tùy chọn
94
+ },
95
+ ],
96
+ }
93
97
  ```
94
98
 
95
- Trong app, gọi `DocumentQrService.processImagesToPdf` và giải phóng
96
- `DocumentQrService.release(qrResult)` khi hết sử dụng preview. Helper tự xóa PDF
97
- sau upload; thư mục native chứa mọi preview được xóa khi release kết quả, kể cả
98
- preview của trang có mã trùng. Native không xóa ảnh đầu vào. Khi hủy/lỗi trước
99
- khi chuyển quyền sở hữu, wrapper xóa toàn bộ output của session.
99
+ Dùng `{ scanQr: false }` khi chỉ cần PDF. Khi đó native bỏ qua đọc QR và tạo
100
+ preview. Native không xóa ảnh đầu vào. Sau thành công, caller chịu trách nhiệm
101
+ xóa output và ảnh chụp khi không còn sử dụng. Nếu hủy hoặc có lỗi trước khi
102
+ chuyển quyền sở hữu, wrapper tự giải phóng output của session.
103
+
104
+ Hủy được kiểm tra giữa các trang và trước/sau khi đóng PDF. Trang đang được
105
+ Vision/ML Kit xử lý sẽ hoàn tất trước khi dọn tài nguyên. Lỗi đọc QR nằm trong
106
+ trạng thái từng trang; lỗi decode ảnh hoặc ghi PDF hủy cả session để tránh trả
107
+ PDF thiếu trang. Lỗi tạo preview không làm mất mã đã đọc được.
100
108
 
101
- Android copy JPEG từ scanner sang cache do app quản lý, không re-encode; callback
102
- được xử lý qua activity listener duy nhất, không đăng ký launcher lặp mỗi lần scan.
103
- iOS lưu ảnh theo từng trang trên worker và chỉ trả kết quả khi camera đã đóng.
104
- Hủy, lỗi camera, thiếu foreground activity và một lần mở camera đang chạy đều được xử lý.
109
+ ## Luồng xử lý native
105
110
 
106
- Hủy được kiểm tra giữa các trang và trước/sau khi đóng PDF. Một trang đang được
107
- Vision/ML Kit xử lý sẽ chạy xong rồi mới dọn tài nguyên; không giải phóng bitmap
108
- trong lúc decoder còn dùng nó.
111
+ ```text
112
+ Ảnh đã chụp
113
+ → decode và chuẩn hóa hướng EXIF
114
+ → đọc QR trên bitmap
115
+ → tạo preview và ghi trang PDF
116
+ → trả PDF URI, mã QR và trạng thái từng trang về JavaScript
117
+ ```
109
118
 
110
- ## Phạm vi và kiểm tra
119
+ Các trang được xử lý tuần tự trên worker. Không truyền bitmap/base64 qua bridge
120
+ và không cần render lại PDF vừa tạo để đọc QR.
111
121
 
112
- Mọi luồng `ScanFileDocument` đều dùng camera và PDF writer mới. Luồng không cần QR
113
- truyền `scanQr: false`, bỏ qua decoder và preview nhưng vẫn trả ảnh gốc cho caller.
114
- Luồng chọn PDF có sẵn tiếp tục dùng `react-native-pdf-thumbnail` để render trang.
115
- `rn-qr-generator` và patch của nó đã gỡ; phần đọc mã từ ảnh trong màn QR,
116
- `TextRecognizeService` và `DocumentQrService` đều dùng module này.
117
- Camera quét trực tiếp vẫn dùng component VisionCamera hiện có (QR + EAN-13).
118
- Thuật toán biên/crop tài liệu là API native của hệ điều hành.
122
+ - iOS dùng ImageIO, Vision, Core Graphics và autorelease pool theo từng trang.
123
+ - Android dùng ImageDecoder, ML Kit barcode-scanning bundled 17.3.0 và PDF writer
124
+ ghi JPEG trực tiếp; camera dùng play-services-mlkit-document-scanner 16.0.0.
125
+ - Ảnh đầu vào được giới hạn cạnh dài 4096 px; PDF tối đa 3000 px, JPEG 92%;
126
+ preview tối đa 1000 px, JPEG 85%. Không phóng to ảnh nhỏ.
127
+ - Luồng xử lý tài liệu thử thêm bốn vùng chồng lấn 60% khi chưa thấy payload
128
+ `doc|...|<số>`. Kết quả vẫn chứa các chuỗi QR thô để ứng dụng tự parse, đối chiếu
129
+ và gộp mã theo nghiệp vụ.
119
130
 
120
131
  ## Đọc QR/barcode từ ảnh
121
132
 
122
133
  ```ts
123
134
  import { scanBarcodes, scanQrImage } from 'react-native-document-processor';
124
135
 
125
- const qr = await scanQrImage('/path/to/image.jpg'); // Chỉ QR
136
+ const qr = await scanQrImage('/path/to/image.jpg');
126
137
  const all = await scanBarcodes('file:///path/to/image.jpg');
127
138
  const selected = await scanBarcodes('content://provider/image', {
128
139
  formats: ['qr', 'ean-13'],
@@ -130,75 +141,68 @@ const selected = await scanBarcodes('content://provider/image', {
130
141
  // { values: ['0030358'], codes: [{ value: '0030358', format: 'qr' }] }
131
142
  ```
132
143
 
133
- Android dùng ML Kit bundled đã có; iOS dùng Vision, không thêm dependency.
134
- API chạy trên worker, dùng chung decoder giới hạn 4096 px và chuẩn hóa EXIF với
135
- luồng tài liệu. Không mở camera, tạo PDF, preview hoặc file tạm; không xóa ảnh đầu vào.
136
- Hỗ trợ đường dẫn tuyệt đối/`file://`, thêm `content://` trên Android; không nhận
137
- URL mạng/base64. Không có mã trả `values: [], codes: []`; ảnh hỏng/lỗi decoder reject.
138
- Đọc nhiều mã, gộp mã trùng và giữ chuỗi gốc, kể cả số 0 đầu.
144
+ API chạy trên worker, giới hạn ảnh 4096 px và chuẩn hóa EXIF. Không mở camera,
145
+ tạo PDF hoặc xóa ảnh đầu vào. Hỗ trợ đường dẫn tuyệt đối, `file://` và thêm
146
+ `content://` trên Android; không nhận URL mạng hoặc base64.
147
+
148
+ Không phát hiện mã trả `{ values: [], codes: [] }`. Ảnh hỏng hoặc lỗi decoder
149
+ reject Promise. Kết quả hỗ trợ nhiều mã, loại mã trùng và giữ nguyên chuỗi,
150
+ kể cả số 0 đầu.
139
151
 
140
152
  Các format: `qr`, `ean-13`, `ean-8`, `upc-a`, `upc-e`, `code-128`, `code-39`,
141
153
  `code-93`, `codabar`, `itf`, `pdf-417`, `aztec`, `data-matrix`. iOS quy đổi UPC-A
142
- từ EAN-13 có số 0 đầu khi yêu cầu UPC-A. Không cung cấp API tạo ảnh QR vì app
143
- không dùng chức năng generate của thư viện cũ. Với giấy tờ, `scanQrImage` chỉ đọc QR
144
- để tránh nhận nhầm chữ thành barcode 1D; fallback crop của luồng PDF có sẵn giữ nguyên.
154
+ từ EAN-13 có số 0 đầu khi yêu cầu UPC-A.
145
155
 
146
- Các kiểm tra tự động bao gồm matching mã, trang trùng, camera mới, xử lý tuần tự,
147
- hủy, lỗi ghi file, cleanup và giữ ảnh của caller không cần QR. Chạy trong project
148
- ứng dụng 24hMoney (các test service/helper nằm trong ứng dụng):
156
+ Package không render PDF có sẵn. Để đọc QR trong PDF local, ứng dụng cần render
157
+ lần lượt từng trang thành ảnh bằng một thư viện PDF, rồi gọi `scanQrImage` và
158
+ xóa ảnh tạm sau khi xử lý. Giữ tệp PDF gốc để lưu hoặc upload.
149
159
 
150
- ```sh
151
- yarn jest --runInBand src/services/__tests__/DocumentQrService.test.ts src/helpers/__tests__/FileUploadHelper.documentQr.test.tsx node_modules_dev/react-native-document-processor/src/__tests__/index.test.ts
160
+ ## Phát triển và kiểm tra
161
+
162
+ Clone repository và dùng dependency `file:` trong ứng dụng host để thử source
163
+ local. Chạy autolinking/pod install rồi rebuild native khi thay đổi iOS/Android.
164
+
165
+ Repository chứa:
152
166
 
153
- # macOS + Xcode + JDK: kiểm tra PDF bằng parser/render độc lập
154
- bash node_modules_dev/react-native-document-processor/tests/check-pdf-writer.sh
167
+ - `src/__tests__/index.test.ts`: kiểm tra API, format, camera, thứ tự trang,
168
+ hủy, lỗi native và quyền sở hữu file. Chạy với Jest preset React Native của
169
+ ứng dụng host; cấu hình Jest để bao gồm thư mục source của thư viện.
170
+ - `tests/check-pdf-writer.sh`: tạo PDF 30 trang bằng Java rồi đọc/render bằng
171
+ PDFKit để kiểm tra số trang, thứ tự, kích thước và hướng ảnh.
172
+ - Android instrumentation tests cho ML Kit, PDF, EXIF, nhiều QR, barcode,
173
+ cleanup và xử lý camera khi không có foreground activity.
155
174
 
156
- # Tại thư mục android, có thiết bị ADB: chạy ML Kit/PDF/JNI thực
175
+ ```sh
176
+ # Tại repository thư viện, cần macOS, Xcode và JDK
177
+ bash tests/check-pdf-writer.sh
178
+
179
+ # Tại thư mục android của ứng dụng host đã autolink, cần thiết bị ADB
157
180
  ./gradlew :react-native-document-processor:connectedReleaseAndroidTest
158
181
  ```
159
182
 
160
- Nếu clone riêng repository thư viện, kiểm tra PDF writer độc lập bằng
161
- `bash tests/check-pdf-writer.sh` trên macOS có Xcode và JDK. Test React Native và
162
- Android instrumentation cần chạy trong ứng dụng host đã autolink module này.
163
-
164
- Đã kiểm tra riêng Objective-C bằng Clang với iOS SDK/React headers thực, Java bằng
165
- javac với Android SDK và dependency đã cache. PDF Android 30 trang đã được đọc
166
- và render bằng PDFKit, kiểm tra số trang, thứ tự, kích thước và hướng ảnh.
167
- App Android release đã build và cài trên MI 8 Lite; bảy instrumentation test
168
- ML Kit/PDF/cleanup/camera thiếu activity, nhiều QR, EXIF, EAN-13, Code128,
169
- lọc QR-only và khôi phục sau ảnh lỗi đã chạy thành công trên thiết bị.
170
- Chưa build/link toàn bộ app iOS hoặc kiểm thử chụp giấy thật tự động.
171
183
  Nếu JDK không nằm trong PATH, đặt `DOCUMENT_PROCESSOR_JAVAC` và
172
- `DOCUMENT_PROCESSOR_JAVA` trỏ đến hai executable tương ứng khi chạy script.
184
+ `DOCUMENT_PROCESSOR_JAVA` thành đường dẫn executable tương ứng.
173
185
 
174
- Cần kiểm thử thực tế bộ 10/24/30 trang, QR nhỏ/mờ/xoay, nhiều QR trên một trang,
175
- chụp thêm 24 + 6 trang, hủy/thoát màn hình và upload lỗi. Ảnh trên 4096 px được
176
- downsample nên cần đo khả năng đọc QR rất nhỏ trên giấy thật. Chưa đo thời gian/RAM
177
- hoặc đưa ra tỷ lệ tăng tốc trên thiết bị.
186
+ Bản sửa iOS Simulator đã được kiểm tra với PDF mẫu 30 trang, đọc đủ 10 QR trong
187
+ ứng dụng host. Camera trên thiết bị thật vẫn cần kiểm tra với giấy nhỏ/mờ/xoay,
188
+ chụp nhiều đợt và thao tác hủy. Không công bố tỷ lệ tăng tốc hoặc mức RAM chung
189
+ cho mọi thiết bị.
178
190
 
179
- ## Log khi test Android
191
+ ## Log Android
180
192
 
181
- Log native và các sự kiện `DocumentQrService` dùng chung tag `DocumentScan`,
182
- hoạt động cả trong release. Mặc định tắt; bật trên thiết bị test bằng:
193
+ Log native dùng tag `DocumentScan`, mặc định tắt. Bật trên thiết bị kiểm tra:
183
194
 
184
195
  ```sh
185
196
  adb shell setprop log.tag.DocumentScan DEBUG
186
197
  adb logcat -v threadtime 'DocumentScan:D' 'AndroidRuntime:E' '*:S'
187
198
  ```
188
199
 
189
- Android Studio: mở project `android`, chọn MI 8 Lite trong Logcat và lọc
190
- `tag:DocumentScan`. Các sự kiện gồm `camera.*`, `session.*`, `page.*`,
191
- `pdf.complete`, `barcode.*`, `js.native:complete`, `js.upload:*`. Log hiển thị thời gian
192
- xử lý, số trang, kích thước PDF, QR từng trang, mã khớp/thiếu/thừa và lỗi.
193
- Không ghi bitmap/base64. Log có mã giấy tờ khi bật nên chỉ lưu cục bộ để test.
200
+ Các sự kiện gồm `camera.*`, `session.*`, `page.*`, `pdf.complete` và `barcode.*`.
201
+ Ứng dụng có thể bổ sung sự kiện qua `logDocumentEvent(event, data)`. Log có thể
202
+ chứa mã tài liệu; chỉ bật khi cần chẩn đoán. Không ghi bitmap/base64.
194
203
 
195
- Tắt khi hoàn tất (hoặc thiết bị khởi động lại):
204
+ Tắt khi hoàn tất hoặc khởi động lại thiết bị:
196
205
 
197
206
  ```sh
198
207
  adb shell setprop log.tag.DocumentScan INFO
199
208
  ```
200
-
201
- Tài liệu API:
202
- [Apple Vision](https://developer.apple.com/documentation/vision/vndetectbarcodesrequest),
203
- [ML Kit barcode scanning](https://developers.google.com/ml-kit/vision/barcode-scanning/android),
204
- [Android ImageDecoder](https://developer.android.com/reference/android/graphics/ImageDecoder).
@@ -1,6 +1,7 @@
1
1
  #import <React/RCTBridgeModule.h>
2
2
  #import <React/RCTInvalidating.h>
3
3
  #import <ImageIO/ImageIO.h>
4
+ #import <TargetConditionals.h>
4
5
  #import <UIKit/UIKit.h>
5
6
  #import <Vision/Vision.h>
6
7
  #import "DPDocumentCapture.h"
@@ -53,6 +54,13 @@ static NSDictionary<NSString *, NSArray<VNBarcodeSymbology> *> *DPBarcodeFormats
53
54
  static NSArray<VNBarcodeObservation *> *DPReadBarcodes(CGImageRef image,
54
55
  NSArray<VNBarcodeSymbology> *symbologies, NSError **error) {
55
56
  VNDetectBarcodesRequest *request = [VNDetectBarcodesRequest new];
57
+ #if TARGET_OS_SIMULATOR
58
+ // The default QR revision cannot create its inference context on Simulator.
59
+ // Revision 1 reads document QR codes without that inference path.
60
+ if (symbologies.count == 1 && [symbologies.firstObject isEqualToString:VNBarcodeSymbologyQR]) {
61
+ request.revision = VNDetectBarcodesRequestRevision1;
62
+ }
63
+ #endif
56
64
  request.symbologies = symbologies;
57
65
  VNImageRequestHandler *handler = [[VNImageRequestHandler alloc] initWithCGImage:image options:@{}];
58
66
  return [handler performRequests:@[request] error:error] ? (request.results ?: @[]) : nil;
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "react-native-document-processor",
3
- "version": "0.1.0",
4
- "description": "Native image-to-PDF and QR processing for 24hMoney",
3
+ "version": "0.2.0",
4
+ "description": "Native document capture, image-to-PDF conversion and QR/barcode scanning for React Native",
5
5
  "main": "src/index.ts",
6
6
  "react-native": "src/index.ts",
7
7
  "types": "src/index.ts",
8
8
  "license": "UNLICENSED",
9
- "author": "24hMoney",
9
+ "author": "quocvu12345",
10
10
  "repository": {
11
11
  "type": "git",
12
12
  "url": "git+https://github.com/quocvu12345/react-native-document-processor.git"