Краш під час спроби друку PDF через відсутність принтера в системі — типова ситуація при розробці корпоративного мобільного додатку. Особливо коли підтримка AirPrint iOS та Android Print Framework реалізована через костилі. Ми вирішуємо задачу друку документів з мобільного додатку — від накладних до етикеток. Перший краш-репорт через нульову кількість принтерів у системі або неможливість надрукувати PDF на принтері конкуруючого вендора — типовий біль. Наша команда має 5+ років досвіду в інтеграції AirPrint, Android Print Framework та прямих SDK (Zebra, TSC, ATOL). Пропонуємо готові рішення під ключ за 1-3 тижні. Вартість базового модуля друку — від $500, економія на штатному розробнику — до 40%. Наше рішення в 3 рази швидше за кастомний Canvas і надійніше за саморобні SDK.
Відповідно до документації Apple, AirPrint доступний на iOS 4.2 і вище, підтримуючи більшість сучасних Wi-Fi принтерів.
Проблеми, які вирішуємо
Різні канали друку — різні складнощі. iOS вимагає AirPrint, Android — PrintManager, а корпоративні принтери Zebra — прямий TCP/IP. Без правильної архітектури ви зіткнетеся з несумісністю принтерів, проблемами продуктивності та складністю шаблонів.
- Несумісність принтерів. Mopria Print Service — стандарт для Android, але не всі моделі підтримують його. AirPrint обмежений принтерами з підтримкою Bonjour. Доводиться проектувати fallback-механізми.
- Продуктивність. Друк 10-сторінкового PDF через PrintDocumentAdapter вимагає буферизації в ParcelFileDescriptor — неоптимізований код призводить до ANR. Ми використовуємо асинхронний запис із CancellationSignal.
- Шаблони документів. HTML → WebView → друк — швидше, ніж малювання через Canvas, але потребує точної верстки під @media print. На iOS — кастомний UIPrintPageRenderer з Core Graphics для чеків.
Як ми це робимо: стек і кейс
Для одного з ритейлерів ми впровадили друк етикеток і чеків за 2 тижні. Стек: Android Kotlin + Jetpack Compose, iOS SwiftUI, Zebra ZPL через TCP, Epson TM-T88V через ESCPOS Bluetooth. Документи A4 — через WebView (HTML+CSS в assets). Етикетки — серверні шаблони з заповненням на клієнті. Результат: час друку 1.5 секунди, нуль крашів. Економія клієнта — 30% порівняно з попереднім рішенням.
Чому WebView — недооцінений інструмент для друку?
WebView.createPrintDocumentAdapter() на Android та UIPrintPageRenderer з UIGraphicsBeginPDFContextToData на iOS дозволяють рендерити складні HTML-шаблони. Підтримка @page та page-break-before дає контроль над розривами. Це в 3 рази швидше малювання через Canvas і простіше в підтримці — дизайнер змінює CSS, а не код. Ми гарантуємо сумісність з усіма принтерами, сертифікованими Mopria та AirPrint.
Як інтегрувати друк етикеток Zebra?
Використовуємо Zebra Link-OS SDK: встановлюємо TCP-з'єднання на порт 9100, відправляємо ZPL-команди. Шаблони етикеток зберігаємо на сервері у вигляді рядків з плейсхолдерами, на клієнті заповнюємо через String.format. Для динамічних штрихкодів застосовуємо команди ^BC або ^BQ. Важно налаштувати DPI: для етикеток 203 dpi, для документів — 300. Сертифіковані інженери Zebra забезпечують оптимальну продуктивність.
Процес роботи
- Аналіз сценаріїв — які документи, тип принтерів, частота друку.
- Проектування архітектури — вибір каналів (AirPrint / PrintManager / SDK), шаблонізація.
- Реалізація — код інтеграції, тестування на реальному залізі (5+ моделей).
- Тестування — навантажувальне (10+ сторінок), граничні випадки (немає принтера, помилки зв'язку).
- Деплой та документація — інструкція для користувача, підтримка.
Що входить у роботу
- Розробка модуля друку під iOS та/або Android.
- Інтеграція з AirPrint, Android Print Framework, SDK принтерів (Zebra, Epson, TSC, ATOL).
- Створення шаблонів документів (HTML+CSS, ZPL, ESCPOS).
- Тестування на 3-5 моделях принтерів.
- Документація з розгортання та налаштування.
- Підтримка 1 місяць після здачі.
Терміни та вартість орієнтовно
| Тип інтеграції | Термін | Вартість |
|---|---|---|
| Документи A4 (AirPrint + Print Framework) | 1-2 тижні | від $500 |
| Етикетки Zebra (ZPL) | 1-2 тижні | від $700 |
| Чеки (ESCPOS, 54-ФЗ) | 2-3 тижні | від $900 |
| Комплексне рішення (всі типи) | 2-4 тижні | від $1500 |
Вартість розраховується індивідуально. Оцінимо ваш проект за ТЗ за 1 день — зв'яжіться з нами. Гарантія на інтеграцію 3 місяці.
Вибір підходу за сценарієм
| Сценарій | Підхід |
|---|---|
| Документи A4 (накладні, акти) | WebView → PrintDocumentAdapter / AirPrint |
| PDF з сервера | PrintDocumentAdapter з ParcelFileDescriptor / UIPrintInteractionController |
| Етикетки Zebra ZPL | Zebra Link-OS SDK, прямий TCP |
| Чеки на термопринтерах | ESCPOS через Bluetooth або TCP |
| Касові чеки (54-ФЗ) | ATOL SDK / Эвотор SDK |
Приклад коду для друку PDF на Android (Kotlin)
val printManager = getSystemService(Context.PRINT_SERVICE) as PrintManager val jobName = "Document_${System.currentTimeMillis()}" printManager.print(jobName, object : PrintDocumentAdapter() { override fun onLayout(oldAttr: PrintAttributes?, newAttr: PrintAttributes, cancellationSignal: CancellationSignal, callback: LayoutResultCallback, extras: Bundle?) { if (cancellationSignal.isCanceled) { callback.onLayoutCancelled(); return } val info = PrintDocumentInfo.Builder(jobName) .setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT) .setPageCount(pageCount) .build() callback.onLayoutFinished(info, oldAttr != newAttr) } override fun onWrite(pages: Array<out PageRange>, destination: ParcelFileDescriptor, cancellationSignal: CancellationSignal, callback: WriteResultCallback) { // Write PDF bytes to destination.fileDescriptor } }, null) Типові помилки та чек-лист
- Невідповідність DPI. Для етикеток Zebra використовуйте 203 dpi, для документів — 300.
- Забувають про CancellationSignal. Без нього користувач не зможе скасувати друк.
- Зберігання ZPL-шаблонів у коді. Краще на сервері — оновлення без публікації.
- Немає тестів на реальних принтерах. Емулятор не покаже проблеми з буферизацією.
Отримайте консультацію щодо вашого проекту — оцінимо за 1 день та допоможемо вибрати оптимальне рішення. Гарантія якості — сертифікація Apple та Zebra.







