Docutain Scanner SDK позволяет встроить в приложение полный цикл мобильного сканирования: камера автоматически находит границы листа, выбирает момент съёмки, исправляет перспективу, обрезает фон и передаёт пользователю страницы для поворота, повторной съёмки, сортировки и фильтрации. После подтверждения приложение может получить отдельные JPG, подготовить PDF, сохранить исходный кадр для собственной обработки либо передать распознанный текст и структурированные реквизиты в следующий этап бизнес-процесса.
Рабочий экран строится вокруг видоискателя и зелёного многоугольника, которым отмечается найденный документ. В нижней панели размещаются фонарь, кнопка затвора и завершение многостраничной серии; при необходимости рядом появляется импорт из файлов. После съёмки открывается редактор страницы с командами обрезки, поворота, выбора фильтра, перестановки, удаления, добавления и повторного захвата.
Поведение этого интерфейса задаётся конфигурацией до запуска камеры. Разработчик может включить автоматический или ручной спуск, разрешить переключатель режима, ограничить процесс одной страницей, показать итоговую ленту миниатюр, скрыть лишние инструменты, заменить подписи и значки, настроить фирменные цвета, активировать тёмную тему, добавить подсказки и определить, какие данные должны вернуться после завершения.
Скачать Docutain Scanner SDK
- Редактирование PDF
- Русский интерфейс
- Просто новичкам
- Нужен лицензионный ключ
- Нет браузерной версии
- OCR — отдельная лицензия
Как проходит сканирование документа
Типовой сценарий начинается не с ручного кадрирования, а с наведения камеры на лист. Алгоритм анализирует видеопоток, ищет четырёхугольник документа и рисует поверх изображения цветной контур. Пользователь сразу видит, распознаны ли все края и не выходит ли угол листа за пределы кадра. Когда положение, резкость и геометрия становятся подходящими, камера может сработать автоматически. Такой порядок уменьшает число смазанных фотографий и избавляет от отдельного шага, на котором приходится выравнивать каждый снимок вручную.
После захвата выполняются коррекция перспективы и обрезка. Если телефон находился не строго над листом, трапеция преобразуется в прямоугольную страницу. Фон стола, пола или папки удаляется по найденным границам. Результат открывается в редакторе, где можно проверить мелкий текст, поля, печати и углы. Только после этой проверки страница считается принятой в текущий документ.
При многостраничной съёмке принятая страница добавляется в набор, а камера остаётся готовой к следующему листу. Счётчик на кнопке завершения показывает, сколько кадров уже накоплено. Пользователю не нужно сохранять отдельный файл после каждой страницы: весь комплект можно просмотреть, переставить и подтвердить одной операцией. Для анкеты, договора, накладной или медицинского комплекта это заметно надёжнее, чем серия несвязанных фотографий.
Экран камеры и обнаружение границ
Главный визуальный ориентир — полупрозрачная область внутри найденного контура. Она показывает не только факт обнаружения, но и реальную область будущей обрезки. Если контур прыгает, не захватывает угол или сливается с фоном, следует изменить положение телефона, добавить света либо подложить под бумагу поверхность контрастного цвета. Такое исправление до спуска полезнее последующей ручной правки: в исходном кадре сохраняется больше деталей, а преобразование перспективы выполняется по точным координатам.
Автоматический спуск управляется параметром autoCapture. При включённом значении пользователь удерживает устройство над документом, а SDK самостоятельно выбирает момент. При отключённом значении кадр создаётся кнопкой затвора. Параметр allowCaptureModeSetting разрешает вывести в верхнюю панель переключатель, чтобы человек мог менять режим прямо во время работы. Это полезно, когда в одном процессе встречаются ровные листы и сложные объекты: например, сначала сканируется договор, затем мятый чек или этикетка на коробке.
Предварительная фокусировка перед снимком задаётся через preCaptureFocus. Она повышает шанс получить читаемый мелкий шрифт, но на некоторых устройствах добавляет короткую задержку. Отключать её разумно только после тестов на реальных моделях телефонов. Для массового корпоративного приложения важнее проверить не флагманскую камеру, а самые слабые поддерживаемые устройства: именно на них разница между быстрым и стабильным захватом заметнее всего.
Фонарь, вибрация и обратная связь
Кнопка фонаря находится в нижней панели сканера. Подсветка помогает при слабом освещении, однако на ламинированных документах и чеках может создать блик. Подсказка должна рекомендовать включать фонарь только тогда, когда отражение не перекрывает текст. Для помещений с постоянным искусственным светом полезно предложить пользователю слегка наклонить документ или телефон, сохраняя все края в кадре.
Параметр vibrateOnCapture добавляет тактильный сигнал после успешного захвата. Он особенно полезен при автоматическом режиме: пользователь понимает, что страница уже принята, и может переворачивать лист. Без вибрации человек иногда продолжает держать документ неподвижно, ожидая подтверждения, либо слишком рано убирает его. В приложениях для складов и курьерских служб виброотклик также помогает работать в шумной обстановке.
Автоматический и ручной режимы
Автоматический режим лучше подходит для ровных листов на контрастной поверхности. Он сокращает число касаний и обеспечивает одинаковую логику съёмки для всех пользователей. Ручной режим нужен для нестандартных ситуаций: неполный документ, разворот книги, лист в прозрачном файле, длинная квитанция, объект с плохо различимыми краями. Переключатель режима не следует показывать без необходимости, потому что лишний элемент усложняет камеру. Если рабочий процесс однороден, безопаснее закрепить выбранное поведение в конфигурации.
Для одностраничной формы можно отключить multiPage. Тогда интерфейс не предлагает продолжать серию после первого кадра, а приложение быстрее переходит к подтверждению. Для договоров, заявлений и транспортных документов многостраничный режим оставляют включённым. Разработчику важно согласовать настройку с серверной схемой: если сервер ожидает один файл на заявку, набор страниц следует объединить в PDF; если каждая сторона обрабатывается отдельно, удобнее вернуть изображения по индексам.
Редактор страницы после съёмки
После завершения камеры открывается экран редактирования. В центре показывается обработанная страница, сверху находятся возврат, удаление и подтверждение, снизу — операции над текущим листом. Базовый набор включает обрезку, поворот, фильтр и перестановку; дополнительно можно разрешить повторную съёмку и добавление новой страницы. Набор инструментов задаётся через PageEditConfiguration, поэтому интерфейс можно сократить до тех операций, которые действительно допустимы в конкретном процессе.
Параметр allowPageEditing управляет самим появлением редактора. Отключать его стоит только в жёстко контролируемом сценарии, где качество проверяется автоматически или оператор не должен менять захваченный материал. В обычном пользовательском приложении пропуск редактора рискован: неправильно найденный угол, случайный поворот или неудачный фильтр попадут дальше без возможности исправления.
Удаление текущей страницы включается параметром allowPageDeletion. Когда страниц несколько, команда может предложить удалить только открытую страницу либо весь набор. Для критичных документов желательно сохранять подтверждение удаления: случайное касание в конце длинной серии обходится дороже, чем дополнительный диалог. Если удаление запрещено бизнес-правилом, кнопку можно полностью скрыть.
Обрезка и ручная коррекция рамки
Инструмент обрезки показывает четыре угловые точки и границы документа. Пользователь перетаскивает маркеры, когда автоматическое распознавание захватило лишний фон или срезало край. В панели доступны действия для расширения рамки до всей фотографии, привязки к обнаруженному документу и подтверждения выбранной геометрии. Эти команды особенно полезны при работе с белой бумагой на светлом столе, перфорированными листами и документами с тёмной рамкой.
Ручная коррекция не восстанавливает область, которая не попала в исходный кадр. Поэтому подсказка на камере должна требовать небольшой запас фона вокруг листа. Если пользователь подносит телефон слишком близко, алгоритм может видеть только три края, а последующее кадрирование уже не вернёт отсутствующий угол. Оптимальный кадр содержит весь документ и узкую контрастную полосу вокруг него.
Поворот, повторная съёмка и добавление листа
Поворот применяется к текущей странице и помогает исправить ориентацию без повторного захвата. В многостраничном документе каждую страницу можно развернуть независимо. После поворота следует проверить фильтр и рамку: сочетание нескольких операций меняет итоговое представление, а мелкий текст возле края может оказаться слишком близко к границе.
Кнопка повторной съёмки включается через allowPageRetake. Она заменяет текущую страницу новым кадром, сохраняя её место в последовательности. Это удобнее удаления с последующим добавлением, потому что порядок остальных листов не меняется. Команда добавления управляется allowPageAdd и возвращает пользователя к камере, когда недостающий лист обнаружен уже на этапе проверки.
Фильтры и качество изображения
В наборе фильтров предусмотрены исходный вид, варианты автоматической цветокоррекции, оттенки серого, чёрно-белая обработка и режим Illustration. Фильтр выбирается по назначению документа. Цветной режим сохраняет печати, подписи маркером и цветовые обозначения. Оттенки серого уменьшают влияние цветного фона. Чёрно-белый вариант подходит для контрастного текста и обычно даёт компактный результат, но может потерять светлые штампы и тонкие линии.
Параметр defaultScanFilter задаёт фильтр, который применяется сразу после захвата. Выбор следует подтверждать на типичных документах, а не на одном тестовом листе. Для кассовых чеков важны бледные термопечатные символы, для накладных — таблицы и рукописные пометки, для удостоверений — цветные защитные элементы. Один агрессивный фильтр не обеспечивает одинаково хорошее качество во всех трёх случаях.
Опция применения ко всем страницам ускоряет обработку однородного документа. Если в наборе смешаны цветная обложка, чёрно-белые листы и фотография, лучше настраивать страницы отдельно. Разработчик может скрыть фильтры через allowPageFilter, когда исходные изображения должны передаваться в собственный конвейер без пользовательских изменений.
Перестановка и итоговое подтверждение страниц
Инструмент Arrange отображает страницы миниатюрами. Пользователь меняет порядок перед формированием файла, а при включённой настройке видит номера страниц и отдельные кнопки удаления. Параметры pageArrangementShowPageNumber и pageArrangementShowDeleteButton позволяют подобрать уровень контроля. Номера полезны для длинного договора; удаление прямо из сетки ускоряет очистку случайных дублей.
Флаг confirmPages добавляет отдельный финальный экран со всеми миниатюрами перед завершением. Он не заменяет редактор, а служит последней проверкой полноты и порядка. Для заявления из одной страницы такой шаг избыточен. Для страхового дела, транспортного комплекта или анкеты с приложениями он снижает риск отправить неполный набор.
При проектировании серверного процесса важно учитывать, что пользователь может завершить сканирование после любого числа страниц. Приложение должно проверить минимальное и максимальное количество, если оно задано бизнес-правилом. Сам интерфейс сканера отвечает за захват и редактирование, но не знает, сколько листов требуется конкретной форме.
Импорт изображений вместо камеры
Источник задаётся параметром source. Значение CAMERA запускает обычный видоискатель. IMAGE передаёт заранее подготовленные пути из кода. GALLERY открывает одиночный выбор из медиатеки, а GALLERY_MULTIPLE — множественный. CAMERA_IMPORT сохраняет камеру, но добавляет кнопку импорта в нижнюю панель. Последний вариант удобен, когда часть документов фотографируют на месте, а часть уже получена по почте или в мессенджере.
Импортированные изображения проходят через тот же интерфейс обрезки, фильтрации и перестановки, что и фотографии с камеры. Параметр autoCrop определяет, выполнять ли автоматическую обрезку найденного документа. Если приложение уже передаёт точно вырезанные страницы, автоматическую операцию можно отключить. Если пользователь выбирает обычные фотографии из галереи, её лучше оставить включённой.
Пути в sourceImages должны быть доступны процессу приложения. Ошибка доступа не связана с распознаванием границ: сначала нужно проверить существование файла и разрешения хранилища. При множественном выборе полезно ограничить число элементов до открытия сканера, иначе большая коллекция высококачественных фотографий может занять слишком много памяти.
Импорт PDF и поддерживаемые форматы
Для загрузки существующих материалов поддерживаются PDF, BMP, JPG, JPEG, PNG, TIFF и HEIC. После загрузки можно сформировать новый PDF, получить текст или запустить извлечение данных, если соответствующие компоненты лицензированы. В Android-документации для операций импорта и анализа требуется включённый Jetifier; этот параметр следует проверить при обновлении сборочной системы.
Зашифрованный PDF необходимо открывать с правильным паролем. При отсутствии пароля или ошибочном значении загрузка вызывает SecurityException, поэтому обработчик должен отличать защищённый файл от повреждённого. Пользователю лучше показать запрос пароля и повторить импорт, а не сообщать общую ошибку чтения. Пароль не следует записывать в журнал или аналитику.
Файл можно передавать как URI, абсолютный путь или массив байтов. Выбор зависит от архитектуры приложения. URI удобен для системного выбора файлов, массив байтов — для уже загруженного содержимого, путь — для внутреннего хранилища. Если файл расположен вне каталога приложения, ответственность за разрешение доступа остаётся у интегратора.
Создание PDF после сканирования
PDF формируется только после того, как документ отсканирован или импортирован. Метод записи возвращает файл либо сообщает об ошибке через последнее состояние SDK. Можно создать обычный PDF на основе изображений или поисковый PDF с текстовым слоем, если доступно распознавание. Для бухгалтерии, архива и корпоративного поиска текстовый слой полезнее, но его наличие следует проверять отдельно: красивое изображение страницы ещё не означает, что слова можно выделить и найти.
Формат страницы передаётся как параметр, например A4. Он определяет геометрию листа в итоговом документе, а не разрешение исходной фотографии. Если страницы имеют разные пропорции, выбранный формат может добавить поля. Для документов, которые затем печатаются, единый формат удобен; для точного хранения оригинальных пропорций следует проверить доступные настройки конкретной платформы.
Операция записи выполняется быстро, но длительность растёт вместе с числом страниц, разрешением и производительностью устройства. Её не рекомендуется запускать в UI-потоке. Приложение должно показать индикатор, запретить повторное нажатие и дождаться результата в фоновом задании. Иначе на слабом телефоне пользователь увидит зависший экран и может запустить экспорт несколько раз.
Ограничение размера PDF
Параметр maxSizeKB задаёт верхнюю границу файла. Если несжатый документ больше, изображения повторно сжимаются до указанного значения. Компромисс прямой: уменьшение размера снижает детализацию и увеличивает время формирования. Нельзя обещать одинаковую читаемость при любом лимите, особенно для многостраничных документов с мелким шрифтом.
Лимит лучше рассчитывать по бизнес-ограничению сервера. Например, если форма принимает файл до определённого размера, следует оставить небольшой запас на метаданные и возможные различия между устройствами. После создания полезно проверить фактический размер и при необходимости предупредить пользователя, что чрезмерное сжатие ухудшит распознавание. Для архивной копии можно хранить более качественный вариант, а на сервер отправлять уменьшенный.
Экспорт страниц в изображения
Каждую страницу можно записать в JPG через Document.writeImage. Число страниц возвращает Document.pageCount(); индексация начинается с первой страницы. Такой экспорт подходит для систем, где сервер принимает изображения по одному, для предварительного просмотра и для собственного OCR-конвейера. Имя файла следует формировать с номером страницы, чтобы порядок не потерялся при асинхронной загрузке.
Кроме файла, страница возвращается как Bitmap или массив байтов. При запросе Bitmap можно передать параметры декодирования и уменьшить размер через inSampleSize. Это важно для миниатюр: нет смысла держать полноразмерную фотографию только ради карточки шириной несколько сотен пикселей. Для финального OCR, напротив, уменьшение может быть нежелательным.
Параметр PageSourceType выбирает стадию обработки. CUT_FILTER возвращает обрезанную и отфильтрованную страницу, которую видел пользователь. CUT_ONLY сохраняет обрезку, но исключает фильтр. ORIGINAL отдаёт исходный кадр без обрезки и цветовой обработки. Это различие принципиально для аудита и машинного анализа: визуально приятный фильтр не всегда оптимален для собственного распознавателя.
Распознавание текста и структурированных данных
Сканер отвечает за получение качественной страницы; распознавание текста и извлечение полей подключаются отдельными компонентами. После завершения можно запросить текст всего документа или конкретной страницы. Поисковый PDF использует распознанный слой, а бизнес-логика может отправить текст в поиск, классификацию или форму проверки. При отсутствии соответствующей лицензии интерфейс захвата продолжает работать, но OCR-функции нельзя считать частью базового набора.
Структурированный анализ возвращает JSON. Среди документированных полей встречаются имя и адрес организации, индекс, город, улица, телефон, идентификатор клиента, дата, сумма, номер счёта, назначение платежа, IBAN, BIC, состояние оплаты и отдельный получатель SEPA. Наличие поля зависит от содержимого документа и конфигурации; приложение должно обрабатывать пустые значения и несколько банковских реквизитов.
Чтение BIC, состояния оплаты и получателя SEPA включается до сканирования. Если BIC отключён, результат может содержать список IBAN; при включении банковские данные возвращаются связанными парами. Для платёжного сценария получатель SEPA особенно важен, потому что отправитель счёта и получатель платежа иногда различаются. Полученные значения следует показывать пользователю для подтверждения, а не безусловно отправлять в платёжную форму.
Даже качественное распознавание не отменяет валидацию. IBAN проверяется по контрольным цифрам, сумма — по допустимому диапазону, дата — по формату и бизнес-правилам, номер счёта — по ожидаемому шаблону. Если несколько кандидатов выглядят правдоподобно, интерфейс должен предложить выбор. Скриншот и извлечённые данные полезно связывать по идентификатору страницы, чтобы оператор мог быстро сверить спорное поле.
Подсказки перед первым сканированием
Встроенное обучение состоит из полноэкранной последовательности и всплывающей карточки поверх камеры. Полноэкранный вариант показывает прокручиваемые элементы с изображением, заголовком и сообщением. Всплывающая карточка объясняет конкретный приём, например необходимость контрастного фона. Оба варианта показываются один раз, но их состояние можно сбросить методом reset для повторного обучения после обновления или по команде в настройках.
Для сканирования документа полноэкранная последовательность по умолчанию не обязательна, тогда как краткая подсказка на камере уместна при первом запуске. Содержимое можно заменить собственными элементами. Текст должен соответствовать реальному процессу: если фонарь отключён политикой приложения, не следует советовать его использовать; если сканируется пластиковая карта, рекомендация о ровном листе должна быть адаптирована.
Кнопки перехода, завершения, пропуска и возврата настраиваются как остальные элементы интерфейса. Возможность пропуска полезна опытным пользователям, но в регулируемом процессе обязательные предупреждения лучше показывать отдельно от необязательного обучения. Onboarding предназначен для объяснения сканирования, а не для юридического согласия.
Панель Scan Tips
Scan Tips открывается из дополнительной кнопки на экране камеры и содержит список практических рекомендаций. В стандартном наборе объясняются освещение, параллельное положение устройства, распознавание границ в реальном времени и съёмка многостраничного документа. Панель по умолчанию может быть выключена; её включают, когда пользователи часто сталкиваются с неправильной геометрией или не понимают автоматический спуск.
Список можно заменить своими элементами. Для курьерского приложения полезны советы о накладных на коробке, для банка — о бликах на счёте, для медицинского сервиса — о конфиденциальности кадра. Хорошая подсказка описывает одно действие и результат: положите белый лист на тёмную поверхность, чтобы камера увидела все четыре края. Общие фразы без конкретного действия не улучшают качество.
Настройка подписей, кнопок и значков
TextConfiguration управляет размерами текста в верхней и нижней панелях, подписями кнопок камеры и заголовками отдельных экранов. Можно задать общий заголовок документа либо разные названия для камеры, редактора, фильтров, обрезки, перестановки и подтверждения. Значение null скрывает конкретный текст. Это позволяет оставить только значок, но такое решение нужно проверять на понятность и доступность.
Отдельно настраиваются подсказки о фокусировке, попытке перелистнуть за первую или последнюю страницу, единственной доступной странице и незавершённой фоновой обработке. Также задаются варианты диалога удаления текущей страницы, всех страниц и отмены. Эти строки важны не меньше заголовков: именно в ошибочных и пограничных ситуациях пользователь должен понимать последствия действия.
ButtonConfiguration позволяет заменить заголовок и иконку каждой кнопки. Для верхней панели при одновременном задании текста и значка отображается значок; нижняя панель может показывать оба элемента. Настраиваются поворот, обрезка, фильтр, перестановка, повторная съёмка, удаление, завершение, расширение рамки, привязка к найденным краям, автоматический режим, фонарь, затвор, импорт и подтверждение.
Замена стандартных значков требует аккуратности. Иконка должна сохранять смысл на светлой и тёмной теме, не сливаться с фоном и иметь достаточную область касания. Если команда опасна, например удаление всех страниц, одного нейтрального значка недостаточно — нужен понятный текст или подтверждение.
Фирменные цвета и тёмная тема
Цветовая схема разделяет основной цвет, цвет элементов на основном фоне, вторичный акцент, фон и передний план панели камеры, контур документа, верхнюю и нижнюю панели. Основной цвет используется для прогресса, вторичных действий и фона главных кнопок. Вторичный акцент окрашивает элементы выбора и кнопку затвора. Цвет контура должен быть заметен на бумаге и окружающем фоне, но не закрывать текст.
Для Android тема наследуется от базовой темы Docutain, а идентификатор передаётся в конфигурацию сканера. Ночная палитра задаётся отдельно; SDK выбирает её по системному режиму и реагирует на изменение оформления во время работы. Нельзя ограничиться инверсией белого и чёрного: зелёный контур, серые подписи и неактивные элементы должны сохранять контраст.
Брендирование следует проверять на всех экранах, а не только на камере. Цвет, который хорошо выглядит вокруг видоискателя, может ухудшить читаемость миниатюр фильтра или кнопок Onboarding. Отдельно тестируются системная строка состояния и навигационная панель; их внешний вид можно переопределить, если автоматический выбор режима конфликтует с фирменной шапкой.
Русский язык и локализация
Язык стандартных подписей определяется локалью устройства. Среди встроенных переводов есть русский, английский, немецкий, французский, испанский, итальянский, польский, украинский не заявлен в опубликованном перечне, а также ряд европейских и азиатских языков. Для неподдерживаемой локали используется английский. Приложение должно учитывать это при обязательном требовании русскоязычного интерфейса.
Собственные тексты через TextConfiguration позволяют полностью контролировать терминологию. Это важно для отраслевых сценариев: Done можно заменить на Добавить в заявку, Retake — на Переснять страницу, а общий заголовок — на название документа. Строки следует хранить в ресурсах приложения, а не жёстко записывать в коде, чтобы переключение языка не требовало пересборки логики.
Длинные русские слова занимают больше места, чем короткие английские подписи. После локализации проверяются узкие экраны, крупный системный шрифт и кнопки с иконкой. Для заголовка верхней панели предусмотрено автоматическое уменьшение до определённого порога, но при явном размере эта автоматика отключается. Поэтому нестандартный размер текста может привести к обрезанной надписи.
Интеграция в Android-проект
Зависимости публикуются в Maven Central. В настройках репозиториев должны присутствовать google() и mavenCentral(). Интерфейс сканирования подключается артефактом de.docutain:Docutain-SDK-UI, а OCR и структурированный анализ — de.docutain:Docutain-SDK-DataExtraction. Разделение зависимостей помогает не включать компонент распознавания, если приложению нужен только захват и экспорт изображений.
Проект должен собираться с compileSdk не ниже 34 и Android Gradle Plugin не ниже 8.0.2. Для новых выпусков Android минимальный уровень API поднят до 23. Эти требования нужно сверять до добавления зависимости: попытка интегрировать библиотеку в старую сборочную цепочку обычно заканчивается ошибками Gradle, а не проблемой самого сканера.
Поддерживаются архитектуры x86, x86_64, armeabi-v7a и arm64-v8a. Эмуляторы x86 и x86_64 подходят для функциональной проверки, но качество и скорость камеры необходимо оценивать на физических устройствах. Чтобы уменьшить размер APK, можно ограничить ABI или использовать Android App Bundle, который отдаёт пользователю только нужные нативные библиотеки.
Высокое разрешение кадров повышает нагрузку на память. В манифесте рекомендуется включить android:largeHeap="true". Это не заменяет управление ресурсами: нельзя одновременно держать все полноразмерные Bitmap, миниатюры и PDF в памяти. После экспорта временные объекты освобождаются, а длинные документы обрабатываются последовательно.
Камера и разрешения Android
Приложение должно запросить доступ к камере до запуска сканера или корректно обработать системный запрос. При постоянном отказе следует объяснить, как открыть настройки разрешений, и предложить импорт файла, если он разрешён процессом. Пустой чёрный видоискатель чаще связан с разрешением, занятостью камеры другим компонентом или жизненным циклом Activity, а не с алгоритмом обнаружения листа.
Запуск выполняется через контракт результата. Успешное завершение и отмена пользователем — разные исходы. После отмены нельзя автоматически формировать PDF из предыдущего состояния без явного решения приложения. После успеха можно продолжить цепочку: получить страницы, создать PDF, прочитать текст или запустить анализ.
Интеграция в iOS и кроссплатформенные проекты
На iOS обязательно задаётся NSCameraUsageDescription в Info.plist. Если объяснение отсутствует, приложение завершится при обращении к камере. Текст системного запроса должен описывать реальную цель, например сканирование документов для заявки. После отказа пользователь может изменить разрешение только в настройках системы, поэтому интерфейс должен предусмотреть понятное сообщение и повторную проверку состояния.
Для .NET MAUI пакет устанавливается через NuGet и нацелен на Android и iOS. В Android-части остаются требования к памяти и сборочной цепочке, в iOS-части — описание доступа к камере. Вызов сканера асинхронный: приложение создаёт DocumentScannerConfiguration, ждёт результат, а затем выполняет экспорт и анализ.
Готовые оболочки доступны для React Native, Flutter, Capacitor, Cordova, Xamarin и нативных проектов. Они предоставляют похожую модель: инициализация, запуск UI, ожидание завершения, запрос PDF, изображений, текста или JSON. Однако имена перечислений и способы передачи файлов различаются. Нельзя механически копировать пример с Android в React Native; следует использовать типы и обработку ошибок конкретной оболочки.
В React Native источник может принимать значения CAMERA, IMAGE, GALLERY, GALLERY_MULTIPLE и CAMERA_IMPORT. Асинхронный вызов отклоняется кодом отмены, если пользователь закрыл процесс. Такой исход не нужно показывать как техническую ошибку. Для остальных исключений логируется диагностическое сообщение и блокируется обращение к результату, который не был создан.
Инициализация и лицензионный ключ
Перед любой операцией SDK инициализируется лицензионным ключом. Если инициализация возвращает ошибку, дальнейшие вызовы выполнять нельзя; диагностическое сообщение читается из свойства последней ошибки. Для первого теста допускается запуск без ключа на ограниченное время — около одной минуты. Этого достаточно, чтобы проверить экран и базовый захват, но недостаточно для полноценного сценария и автоматических тестов.
Для продолжительной проверки оформляется пробный ключ, а для выпуска требуется коммерческая лицензия. Модули лицензируются раздельно, поэтому команда должна заранее определить набор: только сканер, сканер с OCR, структурированное извлечение или дополнительные платёжные функции. Подключение библиотеки в проект ещё не означает, что все API разрешены конкретным ключом.
Ключ нельзя размещать в публичном репозитории, примере или журнале. В мобильном приложении полностью скрыть строку от анализа невозможно, поэтому дополнительно ограничивают пакет, подпись, срок и окружение в соответствии с условиями поставщика. Ошибка ключа должна приводить к безопасному отказу, а не к пустому экрану камеры.
Обработка данных без серверной отправки
Захват, обработка изображений, распознавание и извлечение выполняются на устройстве. Компоненты не требуют передачи документа на сервер поставщика. Это упрощает работу с персональными и финансовыми данными и позволяет сканировать при отсутствии связи. Однако последующее приложение само решает, куда сохранить или отправить результат, поэтому общая конфиденциальность зависит и от кода интегратора.
Для чувствительных документов временные файлы размещают во внутреннем каталоге, удаляют после успешной передачи и исключают из незашифрованных резервных копий. Если нужны миниатюры, их создают из обработанной страницы с разумным разрешением. Журналы не должны содержать полный OCR-текст, IBAN, адреса и пути к общедоступным файлам.
При офлайн-сценарии очередь документов должна переживать перезапуск приложения. Сначала сохраняются страницы и метаданные транзакции, затем формируется PDF, после восстановления сети выполняется отправка. Пользователь должен видеть состояние: сохранено на устройстве, ожидает передачи, отправлено, ошибка. Сам факт успешного сканирования не равен успешной доставке на сервер.
Производительность и размер приложения
Нативные библиотеки для нескольких архитектур увеличивают размер сборки. Android App Bundle уменьшает фактическую загрузку, выдавая подходящий ABI, а отладочные сборки могут быть заметно больше из-за символов. Оценивать размер нужно на release-варианте с теми же модулями, которые пойдут в публикацию. Подключение Data Extraction ради одного эксперимента способно изменить размер сильнее, чем настройки интерфейса.
Основные потребители памяти — видеопоток камеры, полноразмерные страницы, промежуточные фильтры, Bitmap и сборка PDF. Для длинного документа не следует одновременно открывать десятки оригиналов. Миниатюры уменьшаются, экспорт выполняется по страницам, а фоновые операции отменяются при уходе пользователя из сценария. На слабом устройстве полезно ограничить максимальное число страниц.
Автоматическая фокусировка и анализ границ происходят в реальном времени. Если интерфейс тормозит, сначала проверяются другие тяжёлые операции в UI-потоке, отладочная аналитика, параллельная обработка кадров и режим энергосбережения. Затем сравнивается физическое устройство и эмулятор. Низкая частота кадров на эмуляторе не показывает реальное поведение камеры телефона.
Практическая настройка качества
Для документов с мелким шрифтом оставляют предварительную фокусировку, автоматическую обрезку и возможность повторной съёмки. Фильтр выбирают после теста на светлых и тёмных страницах. Для штрихкодов, печатей и цветных отметок сохраняют цвет. Для чётких чёрно-белых форм можно применять монохромный режим, но обязательно сравнивают распознавание тонких линий.
Для мятых чеков автоматический спуск иногда ждёт стабильной прямоугольной формы слишком долго. В таком процессе полезен доступ к ручному режиму и подсказка расправить бумагу. Длинный чек может не помещаться в один кадр; SDK работает со страницами, поэтому приложение должно заранее определить, допустима ли съёмка частями и как затем объединять сегменты.
Для ламинированных карт главная проблема — блики. Фонарь чаще ухудшает результат, а небольшое изменение угла помогает. Для документа в прозрачном файле лучше вынуть лист, если правила допускают. Для разворота книги стандартная прямоугольная коррекция не устраняет кривизну у корешка полностью, поэтому такой материал следует оценивать отдельно.
Сценарий сканирования счёта
Пользователь открывает камеру из формы счёта, видит заголовок Сканировать счёт и наводит устройство на документ. После автоматического кадра он проверяет сумму и нижнюю часть листа, при необходимости выбирает фильтр и подтверждает. Приложение запрашивает текст и структурированные поля, показывает получателя, IBAN, BIC, сумму, дату и номер счёта для проверки, затем создаёт поисковый PDF.
Если найдено несколько IBAN, нельзя автоматически выбирать первый. Поля отображаются рядом со страницей или в отдельной форме, а пользователь подтверждает нужный вариант. Сумма сравнивается с допустимым диапазоном, IBAN проходит контрольную проверку, дата не должна выходить за бизнес-правила. После подтверждения PDF и JSON сохраняются одной транзакцией.
Сценарий для логистики и доставки
Накладные и подтверждения доставки часто снимаются в машине, на складе или возле груза. Здесь полезны вибрация после кадра, ручной режим, кнопка импорта и короткие советы по освещению. Многостраничный набор может включать основную накладную, подпись получателя, этикетку и фотографию повреждения. Порядок страниц проверяется на экране миниатюр перед отправкой.
Если сервер обрабатывает штрихкод отдельным компонентом, для него можно получить ORIGINAL или CUT_ONLY, а пользователю сохранить отфильтрованную версию. Такая развилка избегает ситуации, когда визуальный фильтр ухудшает машинное чтение. Метаданные рейса и идентификатор задания присваиваются до запуска сканера, чтобы восстановить связь после офлайн-работы.
Сценарий для страховой или медицинской заявки
Заявка может содержать форму, чеки, выписку и удостоверение. Камера запускается с многостраничным режимом, редактирование и перестановка остаются доступными, а confirmPages добавляет итоговую проверку. Onboarding объясняет, что в кадре не должно быть посторонних документов и что все углы должны быть видны.
Перед передачей приложение проверяет обязательные страницы и показывает понятные названия категорий. Сам сканер не классифицирует документы по бизнес-типам автоматически, если для этого не построена отдельная логика. Поэтому после каждой страницы можно спросить категорию либо классифицировать OCR-текст собственным сервисом. Чувствительные данные не записываются в диагностический журнал.
Типичные ошибки интеграции
Инициализация завершилась неуспешно
Первым делом читается последнее сообщение об ошибке и блокируется кнопка сканирования. Проверяются ключ, идентификатор приложения, окружение сборки и срок тестового доступа. Нельзя продолжать цепочку в надежде, что камера запустится частично: последующие вызовы могут вернуть вторичные ошибки, скрывающие первоначальную причину.
Камера закрывается на iOS
Проверяется наличие NSCameraUsageDescription и фактическое разрешение. Отсутствующая строка приводит к аварийному завершению при запросе камеры. Если пользователь запретил доступ, показывается кнопка перехода в системные настройки и, при допустимости, импорт готового изображения.
OutOfMemoryError на Android
Включается largeHeap, уменьшается число одновременно удерживаемых Bitmap, миниатюры декодируются с inSampleSize, а длинный документ обрабатывается по страницам. Следует проверить, не сохраняет ли приложение ссылки на старые экраны и результаты после завершения. Простое увеличение кучи без устранения удерживаемых объектов лишь откладывает сбой.
Gradle требует namespace
При переходе на Android Gradle Plugin 8 каждый модуль должен иметь namespace. Сам SDK учитывает это требование, но старая сторонняя зависимость может его нарушать. Сначала обновляются пакеты, затем при необходимости добавляется временная настройка namespace для проблемных подмодулей. Понижать AGP ниже требуемого уровня ради обхода ошибки не следует.
PDF не создаётся
Проверяется, был ли успешно загружен или отсканирован документ, доступен ли целевой каталог и возвращает ли метод файл. После null читается последнее сообщение. Запись выполняется в фоновом потоке, а имя файла очищается от недопустимых символов. Для внешнего каталога проверяется разрешение и свободное место.
Зашифрованный PDF не импортируется
Обрабатывается SecurityException, запрашивается пароль и выполняется повторная загрузка. Нельзя интерпретировать эту ситуацию как неподдерживаемый формат. После нескольких ошибок полезно позволить выбрать другой файл. Пароль хранится только на время операции.
Как диагностировать плохое обнаружение листа
Если контур не появляется, проверяются четыре условия: весь документ находится в кадре, фон отличается по цвету, освещение равномерное, камера сфокусирована. Белый лист на белом столе заменяют на контрастный фон. Блик убирают изменением угла. Слишком близкое положение исправляют увеличением расстояния до тех пор, пока вокруг страницы не появится небольшой запас.
Если контур виден, но постоянно меняет форму, телефон удерживают параллельно листу и стабилизируют. Для автоматического спуска важно дать алгоритму короткое время. На движущемся транспорте или при съёмке с рук ручной режим может быть предсказуемее. Вибрация после захвата сообщает, когда можно убрать документ.
Если обрезка систематически захватывает фон, проверяют документы с рамками, тенями и перфорацией. Пользователю оставляют ручную обрезку, а тестовый набор расширяют. Настройка цвета контура не влияет на алгоритм, она только меняет отображение; попытка исправить распознавание сменой зелёного на синий результата не даст.
Как диагностировать нечитаемый текст
Сначала открывают исходный кадр через ORIGINAL. Если текст размыт уже там, проблема возникла при съёмке: движение, фокус, низкое освещение или слишком большое расстояние. Если оригинал резкий, сравнивают CUT_ONLY и CUT_FILTER. Потеря деталей только после фильтра означает, что выбран слишком агрессивный режим.
Для собственного OCR-конвейера часто разумно передавать CUT_ONLY, чтобы сохранить геометрию без цветовой обработки пользователя. Но универсального правила нет: некоторые распознаватели лучше работают с чёрно-белым изображением. Решение принимают по измеряемой точности на реальных документах, а не по визуальному впечатлению.
При формировании PDF с жёстким лимитом размера проверяют, не стала ли компрессия причиной потери мелкого текста. Если да, увеличивают лимит, уменьшают число страниц в одном файле или отправляют изображения отдельно. Сжатие не может одновременно гарантировать минимальный размер и максимальную детализацию.
Проверка интерфейса перед выпуском
- Все кнопки помещаются на маленьком экране при русском языке и крупном системном шрифте.
- Камера корректно переживает сворачивание, поворот устройства и возврат из системного выбора файлов.
- Отмена не запускает экспорт и не использует страницы предыдущего сеанса.
- Удаление, повторная съёмка, добавление и перестановка сохраняют ожидаемый порядок.
- Светлая и тёмная темы обеспечивают контраст контура, заголовков и неактивных элементов.
- Разрешения камеры и файлов обрабатываются до запуска, после отказа и после изменения в настройках.
- Длинный документ не приводит к исчерпанию памяти и повторному созданию одинаковых PDF.
- Лимит размера проверен на цветных, чёрно-белых и многостраничных материалах.
К этому списку добавляют устройства с разными камерами и пропорциями экрана. Эмулятор удобен для навигации, но не заменяет проверку автофокуса, бликов, скорости обнаружения и качества JPEG. Минимальный набор должен включать слабое устройство, современный телефон и хотя бы одну модель с нестандартной обработкой камеры.
Проверка результата и серверной цепочки
Для каждого документа сохраняется идентификатор сеанса, число страниц, порядок, выбранный тип экспорта и состояние передачи. Сервер проверяет расширение и фактический формат, размер, число страниц и целостность файла. OCR-текст не должен считаться доказательством наличия изображения: оба результата валидируются отдельно.
При повторной отправке используется идемпотентный идентификатор, чтобы офлайн-очередь не создала дубликаты. Если PDF принят, а JSON отклонён, приложение должно либо повторить только недостающую часть, либо безопасно повторить всю транзакцию. Пользователь видит понятный статус, а не внутренний код исключения.
Исходный кадр можно хранить только когда он нужен для аудита или повторной обработки. В остальных случаях достаточно обрезанной страницы и финального PDF. Политика удаления должна учитывать чувствительность документов, требования отрасли и возможность повторной отправки после сбоя.
Сравнение Docutain Scanner SDK с аналогами
| Программа | Лучше подходит для | Главное ограничение |
|---|---|---|
| Docutain Scanner SDK | Офлайн-захват документов с готовой камерой, редактором страниц, PDF и подключаемым извлечением данных | OCR и анализ требуют отдельного модуля и лицензии |
| Scanbot Document Scanner SDK | Мобильные и веб-сценарии с развитым готовым интерфейсом проверки и широкими возможностями настройки | Коммерческий набор может быть избыточен для простого одностраничного захвата |
| Dynamsoft Capture Vision | Единый конвейер для документов, штрихкодов и удостоверений с детекцией и нормализацией изображения | Полный редактор многостраничного документа часто приходится собирать вокруг ядра захвата |
| ABBYY Mobile Capture | Сценарии, где важны автоматический захват, OCR и распознавание данных на мобильном устройстве | Ориентирован на коммерческую интеграцию и требует отдельного согласования лицензии |
| Veryfi Lens | Съёмка чеков, счетов и расходных документов с последующим извлечением данных | Сильнее ориентирован на финансовые документы, чем на универсальный редактор страниц |
Docutain стоит выбирать, когда нужен готовый управляемый экран камеры, многостраничная правка и офлайн-обработка без построения интерфейса с нуля. Scanbot подходит командам, которым дополнительно важен веб-захват и особенно широкий готовый UI. Dynamsoft удобен, если в одном приложении объединяются документы, штрихкоды и удостоверения. ABBYY логичен при приоритете OCR и мобильного распознавания. Veryfi Lens уместен в расходных и бухгалтерских процессах, где основной объект — чек или счёт.
Когда PDF Commander решает другую задачу
PDF Commander предназначен для работы пользователя с уже созданным PDF: просмотра, редактирования, объединения, разделения и других операций над файлом. Он не заменяет встраиваемую камеру и API захвата в мобильном приложении. Поэтому выбор зависит от точки процесса: Docutain нужен разработчику на этапе получения документа, а PDF-редактор — пользователю, которому требуется изменить готовый файл.
В корпоративной схеме оба класса инструментов могут применяться последовательно. Мобильное приложение получает страницы и создаёт PDF, затем сотрудник открывает файл в редакторе для ручной правки. Но переносить функции одного продукта на другой нельзя: наличие PDF-экспорта у сканера не означает полноценного редактирования текста, а возможность открыть PDF на компьютере не добавляет автоматическое обнаружение листа в камере.
Как выбрать конфигурацию для проекта
Сначала фиксируется результат: JPG, PDF без текста, поисковый PDF, OCR-текст или структурированный JSON. Затем определяется источник: только камера, только импорт или смешанный режим. После этого выбираются обязательные действия пользователя — редактирование, повторная съёмка, перестановка, подтверждение всех страниц. Лишь затем настраиваются цвета и подписи.
Для простой анкеты достаточно камеры, одной страницы, автоматического спуска, редактора с обрезкой и поворотом, а на выходе — JPG или PDF. Для договора нужны многостраничность, сортировка, удаление, добавление и финальная лента миниатюр. Для счёта добавляются OCR, анализ реквизитов и форма подтверждения. Для офлайн-логистики — очередь передачи, вибрация и сохранение состояния.
Чем больше скрыто инструментов, тем проще интерфейс, но тем меньше возможностей исправить нестандартный документ. Конфигурация должна отражать допустимые ошибки процесса. Если повторная съёмка невозможна после ухода курьера, кнопку Retake оставляют. Если порядок страниц задан системой и не должен меняться, Arrange скрывают.
Рекомендуемая последовательность внедрения
- Подключить только модуль сканирования и добиться стабильной инициализации на целевых устройствах.
- Настроить камеру, разрешения, многостраничность и редактор без фирменных изменений.
- Проверить экспорт
ORIGINAL,CUT_ONLYиCUT_FILTERна реальных документах. - Добавить PDF в фоновом потоке и обработать ограничения размера.
- Подключить OCR и извлечение данных только после измерения качества захвата.
- Настроить локализацию, цвета, кнопки, Onboarding и Scan Tips.
- Провести тесты памяти, офлайн-очереди, повторной отправки и удаления временных файлов.
Такой порядок отделяет проблемы камеры от проблем распознавания и серверной интеграции. Если пытаться внедрить всё одновременно, ошибка в разрешении, ключе или пути файла может выглядеть как сбой OCR. Поэтапный результат проще измерить: сначала стабильный кадр, затем корректная страница, затем файл, затем данные.
Состояние документа между этапами
Методы экспорта работают с текущим документом, созданным последним успешным сканированием или импортом. Поэтому экран приложения должен явно владеть сеансом: нельзя запускать второй захват, пока первый PDF ещё формируется, и нельзя считать старое число страниц результатом отменённого процесса. Удобная модель состояния содержит идентификатор сеанса, фазу камера, редактирование, экспорт, завершён или ошибка, а также список созданных файлов.
При повторном открытии камеры приложение решает, продолжать набор или начинать новый. Если бизнес-процесс не поддерживает добавление к ранее сохранённому документу, старое состояние очищается до запуска. Если поддерживает, существующие страницы лучше передать через предусмотренный импорт, чтобы пользователь увидел их в той же ленте и мог проверить порядок. Скрытое объединение после завершения затрудняет контроль и может создать дубли.
При уходе приложения в фон асинхронный вызов не следует автоматически считать неуспешным. Система может временно приостановить камеру или показать выбор файла. После возврата проверяется фактический результат. Если Activity или контроллер были уничтожены, состояние восстанавливается из сохранённых метаданных, но полноразмерные Bitmap не кладутся в механизм сохранения экрана.
Отмена, возврат и повторный запуск
Пользователь может закрыть камеру до первого кадра, вернуться из редактора, отменить выбор галереи или завершить системный диалог. Эти события относятся к управляемой отмене, а не к аварии. Интерфейс возвращается в исходную форму без красного сообщения и без отправки пустого файла. Для аналитики отмену можно учитывать отдельно, не записывая содержимое документа.
Если пользователь уже снял несколько страниц и нажал назад, приложение должно заранее определить ожидаемое поведение: показать подтверждение потери, сохранить черновик или продолжить редактирование. Самый опасный вариант — молча оставить страницы в памяти и использовать их при следующем запуске. После подтверждённого отказа временные материалы удаляются, а кнопка нового сканирования создаёт чистый сеанс.
Повторный запуск после технической ошибки разрешается только после устранения причины. При недействительной инициализации бессмысленно снова открывать камеру; при отказе разрешения сначала показываются настройки; при нехватке места освобождается хранилище. Такая логика уменьшает циклы, в которых пользователь несколько раз видит один и тот же сбой без объяснения.
Имена файлов и каталоги хранения
Имя результата формируется приложением, а не интерфейсом сканера. Надёжная схема использует внутренний идентификатор, дату в безопасном формате и назначение документа, например без пробелов и запрещённых символов. Пользовательское название хранится в метаданных и может содержать кириллицу, но физическое имя файла лучше делать предсказуемым для серверов и резервного копирования.
Временные страницы размещаются в кэше, итоговый файл — во внутреннем каталоге до успешной передачи или явного экспорта пользователем. Кэш может быть очищен системой, поэтому документ, ожидающий отправки, нельзя оставлять только там. После перемещения проверяется существование и размер нового файла, затем удаляются промежуточные копии.
При параллельных заданиях нельзя использовать фиксированное имя вроде testPDF.pdf: один экспорт перезапишет другой. Для каждого сеанса создаётся отдельная папка. Завершённая транзакция закрывает доступ к её временным ресурсам, а фоновая очистка удаляет каталоги, которые старше установленного срока и не числятся в очереди передачи.
Проверка числа и порядка страниц
Document.pageCount() даёт фактическое число страниц после завершения. Его сравнивают с требованиями формы. Если ожидается лицевая и оборотная стороны, одна страница считается неполным результатом. Если допускается максимум десять листов, ограничение проверяется до формирования тяжёлого PDF и сопровождается понятным предложением удалить лишние страницы.
Порядок контролируется не по именам временных файлов, а по индексу документа. При экспорте каждая страница получает номер с ведущими нулями, чтобы обычная сортировка не поставила десятую страницу перед второй. После перестановки в редакторе повторно считывается последовательность; старые миниатюры и серверные идентификаторы не должны сохранять прежний порядок.
Для двусторонних документов полезно показывать шаблон ожидаемой последовательности: лицевая сторона, оборотная сторона, приложения. Сканер предоставляет инструменты, но не знает семантики страниц. Проверка полноты остаётся в форме приложения и должна выполняться до кнопки окончательной отправки.
Доступность интерфейса
Настройка текста и значков не должна ухудшать работу экранных дикторов и пользователей с крупным шрифтом. Кнопки с одной иконкой получают понятное доступное имя. Цвет контура и активных элементов не используется как единственный сигнал: режим автоматического захвата дополнительно обозначается текстом или состоянием кнопки. Контраст проверяется в светлой и тёмной темах.
Затвор, фонарь и завершение должны иметь достаточную область касания. При замене стандартных иконок нельзя уменьшать фактическую кнопку до размера рисунка. Длинные подписи тестируются при увеличенном системном масштабе; если панель переполняется, лучше оставить узнаваемую иконку и короткое доступное название, чем уменьшать шрифт до нечитаемого.
Автоматический спуск удобен человеку, которому сложно точно нажать затвор, но требует понятной обратной связи. Вибрация, изменение счётчика и сообщение о принятой странице дополняют друг друга. Пользователь должен иметь возможность перейти в ручной режим, если автоматическое обнаружение не справляется с конкретным документом.
Журналирование без утечки документов
Для диагностики достаточно записывать этап, длительность, число страниц, тип источника, выбранный фильтр, размер результата и код ошибки. Само изображение, OCR-текст, JSON с реквизитами, пароль PDF и лицензионный ключ в журнал не попадают. Даже путь к файлу может содержать пользовательское имя, поэтому безопаснее логировать внутренний идентификатор.
Сообщение LastError полезно разработчику, но перед отправкой во внешнюю аналитику его проверяют на наличие чувствительных данных. Пользователю показывается локализованное объяснение и действие: разрешить камеру, повторить съёмку, выбрать другой файл, освободить место. Внутренний текст исключения можно прикрепить к защищённому отчёту с согласия пользователя.
Метрики качества строятся без хранения страниц: доля повторных съёмок, ручных обрезок, отмен, ошибок экспорта и среднего числа страниц. Если после изменения конфигурации резко выросло количество Retake, это сигнал проверить автофокус или фильтр. Такие показатели помогают улучшать процесс, не собирая содержимое документов.
Тестовый набор документов
Для проверки недостаточно одного белого листа. Набор должен включать цветной счёт, бледный чек, документ с печатью, таблицу с тонкими линиями, мятый лист, страницу с перфорацией, ламинированную карту, фотографию из галереи, многостраничный PDF и защищённый PDF. Каждый образец снимается при хорошем и слабом освещении на нескольких устройствах.
Для каждого результата фиксируются полнота границ, геометрия, резкость, читаемость мелкого текста, сохранность цветных элементов, размер JPG и PDF, скорость обработки и точность нужных полей. Сравниваются исходная, только обрезанная и фильтрованная версии. Это позволяет понять, на каком этапе появляется дефект.
Регрессионный набор не должен содержать реальные персональные данные. Используются синтетические документы с теми же шрифтами, таблицами и расположением полей. Если требуется тест с реальным редким форматом, файл обезличивается и хранится в защищённом контуре с ограниченным доступом.
Преднастроенные профили захвата
В приложении можно создать собственные профили поверх DocumentScannerConfiguration. Профиль Одна форма отключает многостраничность и итоговую сортировку. Договор включает несколько страниц, редактирование, удаление, добавление и подтверждение миниатюр. Счёт оставляет цвет или Illustration, запускает OCR и показывает поля проверки. Склад включает вибрацию, ручное переключение и импорт.
Профиль хранит не только флаги интерфейса, но и серверные правила: обязательное число страниц, формат результата, максимальный размер, необходимость оригинала и срок хранения. Пользователь выбирает бизнес-действие, а не технические параметры. Это снижает риск, что оператор случайно создаст чёрно-белую копию документа, где важна цветная печать.
Изменение профиля требует повторного теста всех связанных этапов. Включение жёсткого лимита PDF влияет на OCR, скрытие редактора — на долю плохих обрезок, отключение предварительной фокусировки — на мелкий текст. Настройку нельзя оценивать изолированно от итогового файла и серверной обработки.
Смешанный режим камеры и импорта
CAMERA_IMPORT полезен в процессах, где документ поступает разными каналами. Пользователь может снять бумажный оригинал или нажать Import и выбрать уже сохранённый файл, не возвращаясь в предыдущую форму. Оба источника приводятся к одному редактору, поэтому порядок, фильтры и экспорт остаются единообразными.
При смешивании важно помечать происхождение каждой страницы во внутренних метаданных. Камерный кадр можно переснять, а импортированный файл — заменить новым выбором. Если требования аудита различают фотографию оригинала и полученную копию, этот признак передаётся на сервер вместе с индексом страницы.
Системный выбор файлов может вернуть изображение с неизвестной ориентацией, большим разрешением или облачным URI. До запуска проверяются доступность и тип, а после импорта — фактическая страница в редакторе. Приложение не должно доверять одному расширению: содержимое и возможность декодирования подтверждаются результатом загрузки.
Работа с оригиналом и обработанной копией
Хранение трёх представлений нужно не всегда. ORIGINAL полезен для аудита и повторного запуска новых алгоритмов, но содержит фон и занимает больше места. CUT_ONLY обычно удобен для собственного распознавания: перспектива исправлена, лишняя область удалена, цвет не изменён. CUT_FILTER предназначен для показа и обычного экспорта.
Если сохраняется оригинал, его связывают с обработанной страницей и ограничивают доступ. Удаление страницы пользователем должно удалить все связанные варианты. При повторной съёмке старый оригинал также удаляется, иначе в хранилище останется документ, который пользователь явно заменил.
На сервер можно отправлять только одно представление, а остальные держать до подтверждения обработки. После успешного OCR оригинал удаляется, если политика не требует архива. Такой подход снижает объём хранения и риск утечки, сохраняя возможность повторить обработку при временной ошибке.
Обновление зависимости без потери качества
Перед заменой пакета сборка проходит тот же регрессионный набор: камера, импорт, редактирование, PDF, изображения, OCR, тёмная тема, русский текст и разрешения. Особое внимание уделяется нативным архитектурам, требованиям Gradle и минимальному уровню Android. Ошибка совместимости проявляется ещё до запуска, а изменение камеры — только на физическом устройстве.
Конфигурация должна компилироваться без устаревших имён полей, а результат отмены и ошибки проверяется заново. Если библиотека меняет внутренние ресурсы или поведение системных панелей, фирменная тема может выглядеть иначе. Снимки эталонных экранов помогают заметить обрезанные кнопки и смену отступов.
Обновление выпускают постепенно и контролируют долю повторных съёмок, падений, ошибок экспорта и средний размер PDF. Возможность быстро вернуть предыдущую сборку приложения важнее попытки исправлять критичную камеру только удалённой настройкой.
Границы ответственности сканера
Компонент получает и улучшает страницы, но не заменяет систему документооборота. Он не решает, к какому делу относится файл, кто имеет право его просматривать, сколько лет хранить и когда считать заявку принятой. Эти правила реализуются вокруг результата и проверяются отдельно.
PDF-экспорт не означает редактирование текста, аннотации, подпись или совместную работу. OCR не гарантирует юридическую точность каждого символа. Извлечение реквизитов не отменяет подтверждение пользователем. Чёткое разделение помогает не предъявлять к камере требования, которые относятся к серверу, редактору PDF или бизнес-валидации.
При правильной архитектуре сканирование становится ограниченным модулем: на вход получает конфигурацию и источник, на выход отдаёт подтверждённые страницы и состояние. Остальные компоненты отвечают за хранение, распознавание, проверку, передачу и аудит. Такое разделение упрощает тестирование и замену отдельных частей процесса.
Итоговый рабочий процесс
Надёжная схема выглядит так: приложение проверяет инициализацию и разрешение камеры, создаёт конфигурацию, запускает видоискатель, получает подтверждённый набор страниц, сохраняет нужную стадию изображения, формирует PDF в фоне, при необходимости распознаёт текст и показывает извлечённые поля пользователю. После проверки результат записывается во внутреннее хранилище и передаётся по правилам конкретного процесса.
Главное преимущество Docutain Scanner SDK раскрывается не в одной кнопке затвора, а в согласованности этапов: обнаружение границ, автоматический момент съёмки, коррекция перспективы, редактор страницы, многостраничная последовательность и предсказуемый экспорт работают в одном интерфейсе. Качество итогового документа зависит от того, насколько точно разработчик настроил этот путь под реальные типы бумаги, устройства, разрешения, ограничения сервера и действия пользователя.