Розробка мобільного додатка для сканування документів
Додаток для сканування документів — це не просто обгортка над камерою. Користувач очікує результат, невідмінний від планшетного сканера: рівні краї, читаний текст, правильна орієнтація, прийнятний розмір PDF. Коли це не виконується — додаток видаляють після першого ж скану паспорта з тінню від пальця.
Детекція та коректування документа
Найважливіше — знайти кордони документа в кадрі та зняти перспективне спотворення. На iOS ланцюжок: AVCaptureSession → VNDetectRectanglesRequest → CIPerspectiveCorrection.
VNDetectRectanglesRequest налаштовується під завдання:
let request = VNDetectRectanglesRequest { request, _ in
guard let results = request.results as? [VNRectangleObservation],
let rect = results.first else { return }
DispatchQueue.main.async {
self.highlightDetectedDocument(rect)
}
}
request.minimumAspectRatio = 0.5
request.maximumAspectRatio = 1.0
request.minimumSize = 0.3 // мінімум 30% площі кадру
request.quadratureTolerance = 20 // допуск на непрямі кути
Після фіксації знімка — CIPerspectiveCorrection з чотирма кутовими точками. Критично важливо: давати користувачеві ручну корректування кутів, коли автодетект промахнувся. Без цього режиму додаток непридатний на мʼятих або частково перекритих документах.
На Android — аналогічний шлях через ML Kit Document Scanner API (з'явився в 2023) або самостійна реалізація через OpenCV findContours → approxPolyDP. ML Kit Document Scanner простіше в інтеграції, але вимагає Google Play Services — не варіант для пристроїв без GMS.
Постобробка зображення
Детекція без покращення зображення дає посередній результат. Після коректування перспективи застосовуємо:
-
Адаптивний поріг — для чорно-білого режиму (паспорти, договори).
CIColorMonochrome+ кастомний kernel абоOpenCV adaptiveThreshold. НеCIPhotoEffectNoir— дає нерівномірні результати на документах з бліддим текстом. -
Шумоподавлення —
CINoiseReductionз параметрами0.02noise level та0.4sharpness для типових офісних документів. - Вирівнювання фону — нерівномірне освітлення (тінь від руки, вікно в кадрі) видаляється через top-hat transform у OpenCV.
Кольоровий режим — для документів з печатками та підписами. Тут важливо не перестискувати контраст — кольорові печатки при агресивній постобробці йдуть у грязь.
Збірка у PDF та OCR
Багатосторінковий PDF збирається через PDFKit на iOS — прямолінійно:
let pdfDocument = PDFDocument()
for (index, image) in scannedPages.enumerated() {
let pdfPage = PDFPage(image: image)!
pdfDocument.insert(pdfPage, at: index)
}
pdfDocument.write(to: outputURL)
На Android — iText7 або PdfDocument з Android SDK.
OCR у документ (searchable PDF) — окрема фіча. VNRecognizeTextRequest на iOS з revision3 дає прийнятну якість для російської та англійської. Результати вбудовуються як скритий текстовий шар через PDFKit. Для серйозних завдань (архіви, юридичні документи) — Google Cloud Document AI або Tesseract з LSTM engine.
Зберігання та синхронізація
Документи займають місце. PDF сторінки A4 при 200 DPI — близько 200–400 КБ після JPEG-компресії з якістю 85. Без компресії — 2–5 МБ. Стратегія зберігання: локально в Application Support (не Documents — інакше iCloud автоматично підхватить усі скани), синхронізація через iCloud Drive або власний бекенд за вимогою користувача.
Для Google Drive / Dropbox інтеграції використовуємо офіційні SDK, не REST напрямо — вони беруть на себе токен-рефреш та часткове завантаження при розриві з'єднання.
Процес впровадження
Важливо визначити одразу: потрібен ліле OCR, які формати експорту (PDF, JPEG, DOCX), вимагається ліле хмарне сховище, є ліле вимоги до юридичної значимості сканів.
Розробка: камера з real-time детекцією → ручна корректування → постобробка → OCR (опціонально) → збірка PDF → експорт.
Часові орієнтири
Базовий сканер з автодетектом та PDF — 3–4 тижні. З OCR, searchable PDF, хмарною синхронізацією та багатосторінковим режимом — 6–9 тижнів.







