Разработка мобильного приложения для сканирования документов
Приложение для сканирования документов — это не просто обёртка над камерой. Пользователь ожидает результат, неотличимый от планшетного сканера: ровные края, читаемый текст, правильная ориентация, приемлемый размер 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 недель.







