
У нас есть сервер CUPS, работающий на Ubuntu 14.04, на котором настроено около 10 принтеров HP. У нас есть смесь клиентов Windows, Linux и Mac, которые печатают на сервере безупречно.
Безупречно, пока некоторые из Mac не были недавно обновлены до Sierra. Теперь, если пользователь пытается печатать через сервер, клиент ведет себя нормально, как и cups. Задание обрабатывается через сервер, и журнал заданий показывает, что задание напечатано нормально. Однако из принтера ничего не выходит. Клиенты Mac могут печатать напрямую на принтере с помощью AirPrint.
У нас была старая версия cups, поэтому мы построили новый сервер 16.04 с последними cups, тот же результат. Мы можем печатать напрямую на принтер с сервера печати на порту 9100, так что эта часть работает нормально.
Можно ли с уверенностью предположить, что проблема не в cups, а в MacOS 12.12? Есть ли у кого-нибудь идеи по устранению неполадок?
решение1
Машины MacOS используют собственный сервер cups. Для современных лазерных принтеров HP cups генерирует вывод PostScript, но с некоторыми специальными настройками для целевого принтера. Сервер cups на машине Linux анализирует ввод PostScript и использует свои собственные настройки для повторной генерации вывода. В Linux скрипт фильтра /usr/lib/cups/filter/hpps вызывается для генерации вывода для большинства лазерных принтеров HP. Проблема заключается в выводе PostScript из MacOS, который, похоже, игнорируется cups под Linux. Скрипт фильтра hpps вызывается с пустым файлом и генерирует пустую страницу. Принтер игнорирует это. Мы нашли два обходных пути для этой проблемы:
1) Отправьте вывод из MacOS, сжатый как gzip, на сервер Linux. Сервер cups распаковывает вывод и передает его фильтру hpps. Фильтр отправляет исходный файл с собственным заголовком и нижним колонтитулом на принтер. Без специальных настроек (например, баннера) вывод фильтра идентичен выводу MacOS. Чтобы добиться этого, добавьте
?compression=gzip
к URI cups на вашем сервере MacOS Cups. Вызовитеhttps://localhost:631браузер (включите интерфейс в терминале с помощью 'cupsctl WebInterface=yes'). Выберите 'Изменить принтер', выполните аутентификацию и выберите протокол печати IPP или IPPS. Целевой URI содержит предыдущий URI. Добавьте строку выше, например
ipps://<ubuntu-cups-server>/printers/<printername>?compression=gzip
Сохраните описание и настройки модели.
2) Установите RAW-принтер на сервере Linux с тем же целевым URI, что и у принтера HP. Но выберите Raw в качестве производителя и модели принтера. Например, если ваш принтер называется 'hp1', добавьте 'hp1_raw' в качестве второго принтера. В MacOS используйте URI RAW-принтера в качестве назначения, например
ipps://<ubuntu-cups-server>/printers/hp1_raw
Остается небольшой риск. Если кто-то отправит на Linux не PostScript-файл в очередь raw, принтер распечатает этот файл как текст. Вы можете получить много смазочных бумажных фрагментов, распечатав небольшой PDF-файл.
решение2
Фильтр hpps
из hplip
упаковки сломан. Наклейте заплатку:
--- /usr/lib/cups/filter/hpps.shipped 2017-01-13 17:23:49.000000000 +0100
+++ /usr/lib/cups/filter/hpps 2017-03-23 14:51:09.904355996 +0100
@@ -144,6 +144,9 @@
try:
job_id, username, title, copies, options = args[0:5]
+ if len(args) > 5:
+ input_fd = os.open(args[5], os.O_RDONLY)
+
job_id = int(job_id)
except IndexError:
bug("Invalid command line: invalid arguments.")
@@ -376,7 +379,7 @@
while True:
try:
- data = os.read(0, 4096)
+ data = os.read(input_fd, 4096)
except IOError:
bug('Unable to read from standart input')
sys.exit(CUPS_FILTER_FAILED)