Лёгкое нативное Windows-приложение, которое делает локальные принтеры, подключённые к ПК, доступными для печати с iPhone/iPad по AirPrint и Android через IPP Everywhere/Mopria по Wi-Fi. Написан с нуля на открытых стандартах — проприетарный код не используется.
- DNS-SD / Bonjour (RFC 6763) — обнаружение принтера в сети;
- IPP (RFC 8011) — приём задания печати;
- рендеринг документа (PDF / Apple Raster URF / PWG Raster / JPEG / PNG) в спулер Windows.
| Компонент | Что делает |
|---|---|
AirPrintLink.Service (Windows-служба) |
Kestrel IPP-сервер на TCP 631; managed-mDNS (Makaretu) с фолбэком на Apple Bonjour; конвейер рендера PDF/URF/JPEG/PNG → спулер; named-pipe IPC-сервер |
AirPrintLink.App (приложение с треем) |
Безрамочное окно + WebView2; значок и меню в трее; мост JS↔.NET → named-pipe клиент |
webui/ |
HTML/CSS/React-интерфейс (офлайн, локальные React + шрифты) |
AirPrintLink.Core |
IPP-кодек, AirPrint TXT, mDNS, рендер/спул, URF-декодер, конфиг, контракты IPC |
Конфиг: %ProgramData%\AirPrintLink\config.json. IPC: \\.\pipe\AirPrintLink.
Анонсируются только физические LAN-интерфейсы (Ethernet/Wi-Fi). Адреса VPN-туннелей (tun/tap/WireGuard/Tailscale) и виртуальных адаптеров (VirtualBox, Hyper-V, vEthernet) исключаются — иначе iPhone резолвит принтер в недостижимый адрес и считает его «отключённым».
dotnet build AirPrintLink.sln -c Debug
# 1) Откройте фаервол для dev-порта (один раз, от администратора):
scripts\dev-firewall.ps1 -Port 6310
# 2) Служба на dev-порту (чтобы не конфликтовать с другими AirPrint-серверами на 631)
$env:AIRPRINTLINK_PORT = '6310'
dotnet run --project src/AirPrintLink.Service
# 3) В другом окне — приложение
dotnet run --project src/AirPrintLink.AppТесты: dotnet test tests/AirPrintLink.Core.Tests
scripts\publish.ps1 # ставит штамп сборки + self-contained сборка в .\dist
scripts\build-msi.ps1 # MSI в .\dist (нужен WiX v5, см. шапку скрипта)
# Установка (от администратора): через MSI…
msiexec /i dist\AirPrinterLink-0.2.2.msi
# …или скриптом
scripts\install.ps1 # служба + фаервол (TCP 631 / UDP 5353, все профили) + ярлык
scripts\uninstall.ps1Требуется среда выполнения Edge WebView2 (есть на всех Windows 11).
- Откройте Air Printer Link → вкладка Принтеры, включите тумблер у нужного принтера.
- На iPhone/iPad в той же Wi-Fi: «Поделиться» → «Печать» → выберите принтер.
- На Android: включите системную службу печати / Mopria Print Service и выберите принтер в диалоге печати.
Это значит, что обнаружение (mDNS) работает, а TCP-соединение до IPP-сервера не проходит:
- Фаервол: входящий TCP-порт службы должен быть открыт. При установке через
MSI/
install.ps1правила создаются автоматически; для dev-запуска выполнитеscripts\dev-firewall.ps1 -Port <порт>от администратора. - VPN/виртуальные адаптеры: исключаются автоматически. Убедитесь, что ПК и iPhone в одной
подсети (в шапке приложения должен показываться адрес вида
Wi-Fi · 192.168.x.x, а неtun0 · …). - Порт 631 занят другим AirPrint-сервером (например, Flyingbee):
Stop-Service AirPrint. - mDNS не ходит между подсетями/VLAN без рефлектора — тестируйте в одной L2-сети.
Диагностика без iPhone:
dns-sd -B "_ipp._tcp,_universal" # анонс виден? (именно этот сабтип ищет iOS)
dns-sd -B "_ipp._tcp,_print" # IPP Everywhere / Android
dns-sd -L "<имя принтера>" _ipp._tcp # TXT-записи- Кириллица в именах: managed-mDNS умеет только ASCII — имена транслитерируются (Кабинет → Kabinet). Для полного UTF-8 переключите механизм mDNS на Bonjour в Настройках.
- Служба видит машинные принтеры; принтеры «только для пользователя» не видны.
- Смена порта/механизма mDNS применяется после перезапуска службы.
Автор: Denis Kulakov. Распространяется по лицензии MIT (см. LICENSE) — свободное использование, изменение и распространение с сохранением уведомления об авторстве. Программа предоставляется «как есть», без каких-либо гарантий.
Товарные знаки: AirPrint®, iPhone® и iPad® — товарные знаки Apple Inc., зарегистрированные в США и других странах. Air Printer Link — независимый проект: он не аффилирован с Apple Inc., не спонсируется и не одобрен ею; название AirPrint используется исключительно для указания совместимости с этой технологией (номинативное использование). Windows® — товарный знак Microsoft Corporation.
.NET 8 (net8.0-windows) · ASP.NET Core / Kestrel · Makaretu.Dns · Windows.Data.Pdf ·
System.Drawing.Printing · WebView2 · WiX v5.
