Симптом: с iPhone документ печатается на одном листе, как надо. Тот же документ с Mac выходит с квадратами и непонятными символами в начале страницы, а вместо одного листа принтер выдаёт целую пачку. Ни принтер, ни macOS при этом никакой ошибки не показывают — проблема видна только на бумаге.
Принтер — чёрно-белое МФУ Xerox B215, подключённое по Wi‑Fi. Мы с Максимом разобрали это в Claude Code: я выполнял команды в терминале и читал ответы принтера, Максим проверял результат на бумаге. Ниже — что оказалось причиной, как мы её нашли и как починить.
Коротко
Mac печатал через временный принтер, который macOS создаёт сама, когда видит устройство в сети. Такой принтер, судя по симптомам, отправлял B215 документ в PostScript, а встроенный интерпретатор PostScript у B215 печатал служебный код как текст. iPhone всегда шлёт растр AirPrint (image/urf), поэтому с него всё в порядке.
Решение — добавить принтер вручную с небольшим файлом описания (PPD), который велит Mac тоже отправлять image/urf. После этого Mac печатает так же, как iPhone.
Что было на этом Mac
| Что | Значение |
|---|---|
| Принтер | Xerox B215 Multifunction Printer, прошивка 88.000.69.000 |
| Подключение | Wi‑Fi, обнаружение через Bonjour |
| macOS | 27, CUPS 2.3.4 |
| Драйвер | не установлен |
Как искали причину
Принтера в системе на самом деле нет
lpstat -v
lpstat -e
lpstat -v ответил «Нет добавленных назначений»: постоянных принтеров в системе нет. А lpstat -e показал очередь вида Xerox_B215_<серийный-номер>_. Значит, Mac печатает через временную очередь, которую создал сам по Bonjour, — без драйвера и без PPD-файла (папка /etc/cups/ppd/ пустая).
Что принтер говорит о себе
Принтер сам сообщает в сеть, какие форматы понимает:
dns-sd -B _ipp._tcp local.
dns-sd -L "Xerox B215 (<серийный-номер>)" _ipp._tcp local.
И подробнее — прямым IPP-запросом:
ipptool -tv ipp://<имя-принтера>.local:631/ipp/print get-printer-attributes.test
Главное в ответе:
document-format-default = image/urf
document-format-preferred = image/urf
document-format-supported = application/octet-stream,application/PCL,application/postscript,application/vnd.hp-PCL,application/vnd.hp-PCLXL,application/x-QPDL,text/plain,image/urf,application/PCLm
Принтер понимает PostScript, PCL и растры, а предпочитает image/urf — растр AirPrint, тот самый, что шлёт iPhone. PDF в списке нет. В отдельной строке Bonjour (URF=…RS300…W8) видно и параметры растра: 300 dpi, оттенки серого.
Отсюда план: заставить Mac отправлять image/urf, как iPhone.
Тупик: стандартный способ не сработал
Для принтеров AirPrint в CUPS есть штатная команда — создать очередь IPP Everywhere, CUPS сам спросит у принтера возможности и сгенерирует PPD:
lpadmin -p Xerox_B215 -E -v ipp://<IP-принтера>:631/ipp/print -m everywhere
На этом Mac она падала с ошибкой lpadmin: Не удается создать PPD-файл: No such file or directory. Почему — мы так и не установили. Если у вас эта команда проходит, дальше можно не читать: она решает ту же задачу без ручного PPD.
Всё нужное в macOS уже есть
ls /usr/libexec/cups/filter/
grep -h -iE 'urf|raster' /usr/share/cups/mime/apple.convs /usr/share/cups/mime/mime.convs
В системе есть фильтры cgpdftoraster и rastertourf, а в правилах преобразования — цепочка «PDF → растр URF». То есть macOS умеет готовить image/urf сама; нужен только PPD, который скажет CUPS: «этому принтеру отдавай URF».
Решение
1. Файл описания принтера
Сохраните текст ниже в файл Xerox_B215_URF.ppd. Главная строка — *cupsFilter2: "image/urf image/urf 100 -": она говорит CUPS, что на выходе нужен только растр URF (формат строки — в спецификации PPD у CUPS).
*PPD-Adobe: "4.3"
*FormatVersion: "4.3"
*FileVersion: "1.0"
*LanguageVersion: English
*LanguageEncoding: ISOLatin1
*PCFileName: "XRXB215U.PPD"
*Manufacturer: "Xerox"
*ModelName: "Xerox B215 Multifunction Printer"
*Product: "(Xerox B215 Multifunction Printer)"
*ShortNickName: "Xerox B215 URF"
*NickName: "Xerox B215, AirPrint URF"
*PSVersion: "(3010.000) 0"
*LanguageLevel: "3"
*ColorDevice: False
*DefaultColorSpace: Gray
*FileSystem: False
*Throughput: "30"
*LandscapeOrientation: Plus90
*TTRasterizer: Type42
*cupsVersion: 2.3
*cupsLanguages: "en"
*APAirPrint: True
*cupsFilter2: "image/urf image/urf 100 -"
*cupsManualCopies: False
*cupsSNMPSupplies: False
*OpenUI *PageSize/Media Size: PickOne
*OrderDependency: 10 AnySetup *PageSize
*DefaultPageSize: A4
*PageSize A4/A4: "<</PageSize[595 842]>>setpagedevice"
*PageSize Letter/US Letter: "<</PageSize[612 792]>>setpagedevice"
*PageSize Legal/US Legal: "<</PageSize[612 1008]>>setpagedevice"
*PageSize A5/A5: "<</PageSize[420 595]>>setpagedevice"
*PageSize Env10/Envelope #10: "<</PageSize[297 684]>>setpagedevice"
*PageSize EnvDL/Envelope DL: "<</PageSize[312 624]>>setpagedevice"
*CloseUI: *PageSize
*OpenUI *PageRegion/Media Size: PickOne
*OrderDependency: 10 AnySetup *PageRegion
*DefaultPageRegion: A4
*PageRegion A4/A4: "<</PageSize[595 842]>>setpagedevice"
*PageRegion Letter/US Letter: "<</PageSize[612 792]>>setpagedevice"
*PageRegion Legal/US Legal: "<</PageSize[612 1008]>>setpagedevice"
*PageRegion A5/A5: "<</PageSize[420 595]>>setpagedevice"
*PageRegion Env10/Envelope #10: "<</PageSize[297 684]>>setpagedevice"
*PageRegion EnvDL/Envelope DL: "<</PageSize[312 624]>>setpagedevice"
*CloseUI: *PageRegion
*DefaultImageableArea: A4
*ImageableArea A4: "12 12 583 830"
*ImageableArea Letter: "12 12 600 780"
*ImageableArea Legal: "12 12 600 996"
*ImageableArea A5: "12 12 408 583"
*ImageableArea Env10: "12 12 285 672"
*ImageableArea EnvDL: "12 12 300 612"
*DefaultPaperDimension: A4
*PaperDimension A4: "595 842"
*PaperDimension Letter: "612 792"
*PaperDimension Legal: "612 1008"
*PaperDimension A5: "420 595"
*PaperDimension Env10: "297 684"
*PaperDimension EnvDL: "312 624"
*OpenUI *ColorModel/Color Mode: PickOne
*OrderDependency: 10 AnySetup *ColorModel
*DefaultColorModel: Gray
*ColorModel Gray/Grayscale: "<</cupsColorSpace 18/cupsBitsPerColor 8/cupsColorOrder 0/cupsCompression 0>>setpagedevice"
*CloseUI: *ColorModel
*OpenUI *cupsPrintQuality/Print Quality: PickOne
*OrderDependency: 10 AnySetup *cupsPrintQuality
*DefaultcupsPrintQuality: Normal
*cupsPrintQuality Normal/Normal: "<</HWResolution[300 300]>>setpagedevice"
*CloseUI: *cupsPrintQuality
*DefaultResolution: 300dpi
*OpenUI *Duplex/2-Sided Printing: PickOne
*OrderDependency: 10 AnySetup *Duplex
*DefaultDuplex: None
*Duplex None/Off: "<</Duplex false>>setpagedevice"
*Duplex DuplexNoTumble/Long-Edge (Portrait): "<</Duplex true/Tumble false>>setpagedevice"
*Duplex DuplexTumble/Short-Edge (Landscape): "<</Duplex true/Tumble true>>setpagedevice"
*CloseUI: *Duplex
*DefaultFont: Courier
*% End of Xerox_B215_URF.ppdXerox_B215_URF.ppd
Поля печати (ImageableArea, около 4 мм с каждой стороны) подобраны на глаз, с документацией Xerox мы их не сверяли. Если что-то обрезается у края — увеличьте числа.
Проверьте файл:
cupstestppd -W all Xerox_B215_URF.ppd
Должно быть PASS.
2. Добавьте принтер
Имя принтера в сети покажет dns-sd -B _ipp._tcp local., а хост для адреса — dns-sd -L "<имя из первой команды>" _ipp._tcp local. (вида <что-то>.local). Адрес по .local-имени, а не по IP, переживёт смену IP-адреса принтера.
lpadmin -p Xerox_B215 -E \
-v ipp://<хост-принтера>.local:631/ipp/print \
-P Xerox_B215_URF.ppd \
-D "Xerox B215" -o printer-is-shared=false
lpadmin -d Xerox_B215
Вторая команда делает принтер основным. lpadmin предупредит, что драйверы принтера устарели и не будут поддерживаться следующими версиями CUPS, — очередь при этом создаётся. У Максима sudo не понадобился; если система откажет в правах, повторите команды с sudo.
3. Печатайте на «Xerox B215»
Старый временный принтер удалить не получится: lpadmin -x ответит, что такого принтера нет. Это не установленный принтер, а устройство, которое Mac видит в сети, — оно и дальше будет в окне печати. Выбирайте «Xerox B215» без серийного номера в скобках. Отключать AirPrint на принтере ради этого не стоит: перестанет работать печать с iPhone.
Как проверить
lpstat -v -d
grep cupsFilter2 /etc/cups/ppd/Xerox_B215.ppd
Должен быть принтер Xerox_B215 с адресом ipp://….local:631/ipp/print, он же — по умолчанию, а в PPD — строка *cupsFilter2: "image/urf image/urf 100 -".
Тестовая страница:
echo "Проверка печати" > test.txt
cupsfilter -m application/pdf test.txt > test.pdf
lp -d Xerox_B215 -o media=A4 test.pdf
У нас вышел один чистый лист, а следом и настоящий документ напечатался как надо.
Ограничения и если сломается снова
- Только ч/б и 300 dpi. Для B215 это норма, но печать фото на нём и так не задумана.
- Настройки переживают перезагрузку и смену IP принтера: очередь хранится в
/etc/cups/printers.conf, PPD — в/etc/cups/ppd/. - Крупное обновление macOS может сбросить принтеры. Признак — снова мусор в начале листа или в окне печати выбран не тот принтер. Держите PPD и команды из шага 2 под рукой: удобно сложить их в скрипт рядом с файлом.
- PPD-драйверы в CUPS устаревают — об этом и предупреждает
lpadmin. Когда их перестанут поддерживать, придётся искать другой путь. - Запасной вариант — официальный драйвер Xerox для B215 (PCL) со страницы поддержки модели. Мы его не ставили и совместимость с macOS 27 не проверяли. В базе знаний Xerox есть общая статья о печати «тарабарщины» и ошибках PostScript — там среди причин указан неподходящий драйвер.
Принтер «по воздуху» с iPhone и Mac — ровно тот случай, когда один и тот же документ уходит на устройство двумя разными путями. Если с одного устройства печать нормальная, а с другого — мусор, первым делом стоит посмотреть, в каком формате каждое из них отправляет задание.