Реалізація генерації штрих-кодів у мобільному додатку
Потреба з'являється раптово: склад хоче друкувати етикетки прямо з телефону, торгова точка — генерувати QR-чеки офлайн, логістичний додаток — створювати Code128 для накладних без звернення до сервера. Здається, дрібна задача, але неправильний вибір бібліотеки вистрільює проблемами пізніше.
Які формати реально потрібні та чим їх генерувати
Лінійні штрих-коди — EAN-13, EAN-8, UPC-A, Code128, Code39, ITF — використовують різні алгоритми контрольної суми. Путати їх неможливо: ретейлери сканують EAN-13, а курйерські служби — Code128 з символами довільного набору. QR-код та Data Matrix закривають двомірні сценарії.
iOS. Нативно CoreImage вміє генерувати QR (CIQRCodeGenerator), Aztec, Code128 та PDF417. Для EAN/UPC простіше взяти ZXingObjC чи обертку поверх ZXing — вона охоплює всі формати одразу. Рендеримо у CIImage, масштабуємо через CGAffineTransform (без інтерполяції, інакше краї пікселів розмиваються), експортуємо у PNG через UIGraphicsImageRenderer.
Android. ZXing (com.google.zxing:core:3.5.x) — стандарт де-факто. MultiFormatWriter.encode() повертає BitMatrix, малюємо у Bitmap через MatrixToImageWriter чи вручну ітеруючи пікселі. Для Jetpack Compose — обертаємо в AndroidView з ImageView, чи використовуємо BarcodeEncoder з journeyapps/zxing-android-embedded.
Flutter. barcode_widget (pub.dev) малює через Canvas без нативного коду. Для виводу у файл — toImage() через RepaintBoundary + RenderRepaintBoundary.toImage(pixelRatio: 3.0).
Типові грабли
Масштабування без interpolationQuality = .none (iOS) дає розмиті краї — сканер їх не читає. На Android аналогічна помилка: Bitmap.createScaledBitmap(..., true) з включеною фільтрацією уничтожает чіткість ліній Code128 при невеликих розмірах.
Контрастність: чорний на білому — це не «за замовчуванням добре». При виводі на темному фоні додатку потрібно явно задавати кольори fgColor/bgColor. QR на прозорому фоні не читається більшістю сканерів в несприятливому освітленні.
Мінімальний розмір QR-коду з коррекцією помилок рівня M — 150×150 dp. Нижче — проблеми на дешевих Android-пристроях з 8 Мп камерою.
Динамічний контент та пакетна генерація
Штрих-коди частіше генеруються не статично, а «на льоту» з даних: артикул товару, номер замовлення, ідентифікатор користувача. Шаблонний підхід: String.format("ORDER-%06d", orderId) → кодуємо → рендеримо. Для масового створення (приклад: 500 етикеток перед відгрузкою) генеруємо у фоновому потоці DispatchQueue.global() / Executors.newFixedThreadPool(4) та показуємо прогрес.
Якщо потрібен штрих-код у PDF-документі — інтегруємо генерацію з PDFKit (iOS) / android.graphics.pdf.PdfDocument (Android): малюємо Bitmap штрих-коду напрямку на PdfDocument.Page.canvas().
Збереження та шаринг
Генеруємо у Bitmap/UIImage, зберігаємо у тимчасовий файл через FileProvider (Android) чи UIActivityViewController (iOS). Для Flutter — path_provider + share_plus. При друку через Bluetooth-принтер (Zebra ZPL, Citizen) передаємо ZPL-команду напрямку, не растрове зображення — це дає чіткість на будь-якому DPI.
Графіки
Реалізація генерації 2–3 форматів з екраном перегляду та кнопкою шаринга — 1 робочий день. Якщо потрібна інтеграція з принтером чи пакетна генерація з шаблонами — 2–3 дні.







