Перейти к содержанию

Xerox B215 печатает мусор с Mac, а с iPhone — нормально

Квадраты и символы в начале листа и пачка лишних страниц при печати с Mac на Xerox B215 по Wi‑Fi. Почему так происходит и как заставить Mac печатать как iPhone.

Симптом: с 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
macOS27, 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

У нас вышел один чистый лист, а следом и настоящий документ напечатался как надо.

Ограничения и если сломается снова

Принтер «по воздуху» с iPhone и Mac — ровно тот случай, когда один и тот же документ уходит на устройство двумя разными путями. Если с одного устройства печать нормальная, а с другого — мусор, первым делом стоит посмотреть, в каком формате каждое из них отправляет задание.


Поделиться: