Продолжение импортозамещения. Рабочие станции мы уже раскатываем в автомагическом режиме, пришло время и о периферии подумать — юзеры, вернее, их руководители, хотят видеть результаты трудов в твёрдом виде на экобумаге.

Прежде всего опишу правильную конфигурацию инфраструктуры сетевой печати в корпорации. Это важнейшая составляющая наших граблей. Заодно зацените схему, делал в отечественном редакторе Автограф под линукс :)



Что и почему (рассматриваем схему справа налево):

  1. Выносим принтеры (вернее, вынесли уже давно) в отдельный сегмент сети и ограничили туда доступ файрволами. Старые принтера и МФУ-шки умеют небезопасные протоколы типа telnet, ftp и т.д. которые уже не лечатся никакими прошивками. С учётом ухода сервиса производителей, эта участь постигнет и более современное железо — прошивки достать уже проблематично, а иногда даже опасно.
  2. В сегмент принтеров имеют доступ только админы и принт-сервер. Так проще наладить учёт печати и разграничить доступ — энтерпрайз это обожает.
  3. Локальный cups на клиентском рабочем месте (линуксовом) — это особенности системы печати. Можно обойтись и без него, достаточно в файле /etc/cups/client.conf указать адрес сервера печати в директиве ServerName , но тогда теряется возможность работы с локальными принтерами и летит к чертям унификация рабочих мест, энтерпрайз это ненавидит.

Про конкурентов
В винде кстати всё примерно также, только чуток гибче, отказ от локального спула не глобальный, а для каждого принтера отдельно


Итак, между нашим отечественным офисным пакетом и принтером находятся 2 купса (подозреваю, что в некоторых случаях и три, т.к. с большой долей вероятности в принтере тоже крутится маленький линукс со своим купсом на борту)

▍ Теперь бегло рассмотрим теорию, как это работает


Офисный специалист нажимает кнопочку печать, и прикладное программное обеспечение отправляет на печать некий готовый материал — это может быть картинка (image/png), файл в формате postscript (application/postscript), pdf-файл (application/pdf), неважно. Вот этот материал загоняется в спул печати. Причём классические lp*-утилиты и библиотеки давным-давно подменены купсом. То есть купс либо принимает информацию в свой спул и обрабатывает, либо (вариант с одной зелёной стрелочкой на схеме) прозрачно льёт купсу принт-сервера.

CUPS на стороне клиента приступает к работе. Условно будем считать, что работаем с файлом, ну хорошо, не условно, в юниксах всё файл :)

  • Файл принимается.
  • Разглядываем его исходный формат, либо нам его сообщили, либо определили сами (man mime.types).
  • Прикидываем в каком формате его надо отдать (в файле описания ppd, потом придётся рассказать).
  • Преобразовываем различными фильтрами (filters).
  • Решаем, куда его надо отдать (backend).
  • Передаём.
  • Дожидаемся результата печати и сообщаем его в место получения файла, а если что-то пошло не по плану, также доводим до сведения отправителя файла.

На сервере печати CUPS вытворяет то же самое.

Вся эта теория имеется в документации CUPS, но несколько бестолково изложено, либо я не был готов сразу вчитать и систематизировать такое количество информации. Совсем немного содержится в статье википедии на русском языке. А теперь сравните её с английской страничкой. Вся информация внятно изложена на 3-х экранах и двух схемах (схема фильтрации — шикарна).

▍ С общей теорией покончено, пора приступать к практике


Как развернуть CUPS на рабочей станции/сервере и добавить принтеры я писать не буду, т.к. это реально просто, и в сети информации достаточно. Отмечу только, что url вида ipp://printer/ipp внутри купса будут развёрнуты в http://printer:631/ipp (а также ipps->https) и могут всюду использоваться равноценно (пруф Chapter 1: Overview of IPP). Используйте как удобнее или больше нравится.



Сначала будем подключать бодрого старичка HP m3027MFP, предположительно родившегося в 2010 году (на картинке из интернета он белый, но все сохранившиеся экземпляры уже жёлтого цвета). К слову, драйверов в системе (файлы .PPD) аж целых 5 штук.

Начинать опять будем справа-налево, т.е. сначала пробуем печать с сервера (у купса для этого имеется специальный тест в интерфейсе администратора). Ставим драйвер "HP LaserJet M3027 MFP Postscript (recommended)", надпись в скобочках внушает доверие, далее пускаем тест и убеждаемся, что всё отлично работает и первая тестовая страничка готова — их у нас будет много.

На клиента водружаем драйвер "HP LaserJet M3027 MFP pcl3, hpcups 3.15.9", по идее ведь неважно, что серверу печати скармливаем? Пусть разбирается. И тут первый облом, трофея мы не дождались. На сервере начинаем разглядывать логи (уровень детализации задаётся в файле /etc/cupsd.conf опция LogLevel). Для этого в админке купса на страничке принтера узнаём номер задания, далее с этим номерком обращаемся к journalctl:

$ journalctl -u cups JID=43

или если у нас журнал ведётся в файлах:

# grep Job\ 43 /var/log/cups/error_log

Смотрим и ничего криминального не замечаем. Видим, что на вход пришло application/vnd.cups-raster, навешано 5 фильтров, один из которых бэкэнд, все отрапортовали "exited with no errors." В конце издевательская надпись "Job completed".

авг 30 14:04:03 cupsd[6597]: [Job 43] Applying default options...
авг 30 14:04:03 cupsd[6597]: [Job 43] Adding start banner page "none".
авг 30 14:04:03 cupsd[6597]: [Job 43] Queued on "HP3027" by "alef13".
авг 30 14:04:03 cupsd[6597]: [Job 43] File of type application/postscript queued by "alef13".
авг 30 14:04:03 cupsd[6597]: [Job 43] Adding end banner page "none".
авг 30 14:04:03 cupsd[6597]: cupsdCheckJobs: Job 43 - dest="HP3027", printer=(nil), state=3, cancel_time=0, hold_until=1660043943, kill_time=0, pending_cost=0, pending_timeout=0
авг 30 14:04:03 cupsd[6597]: [Job 43] time-at-processing=1660043043
авг 30 14:04:03 cupsd[6597]: [Job 43] 4 filters for job:
авг 30 14:04:03 cupsd[6597]: [Job 43] gstopdf (application/postscript to application/pdf, cost 0)
авг 30 14:04:03 cupsd[6597]: [Job 43] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
авг 30 14:04:03 cupsd[6597]: [Job 43] gstoraster (application/vnd.cups-pdf to application/vnd.cups-raster, cost 99)
авг 30 14:04:03 cupsd[6597]: [Job 43] hpcups (application/vnd.cups-raster to printer/320-HP3027, cost 0)
авг 30 14:04:03 cupsd[6597]: [Job 43] job-sheets=none,none
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[0]="HP3027"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[1]="43"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[2]="alef13"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[3]="Test Page"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[4]="1"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[5]="job-uuid=urn:uuid:ad538100-5dab-34bb-7a54-be4bcf445b96 job-originating-host-name=192.168.1.13 date-time-at-creation= date-time-at-processing= time-at-creation=1660043043 time-at-processing=1660043043"

...

авг 30 14:04:03 cupsd[6597]: [Job 43] backendWaitLoop(snmp_fd=5, addr=0x562c4243edc8, side_cb=0x562c4240c2e0)
авг 30 14:04:03 cupsd[6597]: [Job 43] No pages left, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7098 (/usr/lib/cups/filter/gstopdf) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] Input is empty, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] Input is empty, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7099 (/usr/lib/cups/filter/pdftopdf) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7100 (/usr/lib/cups/filter/gstoraster) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7101 (/usr/lib/cups/filter/hpcups) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7102 (/usr/lib/cups/backend/ipp) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] time-at-completed=1660043043
авг 30 14:04:03 cupsd[6597]: [Job 43] Job completed.

Если ещё разок глянуть чуть внимательнее, то видны строчки «Input is empty, outputting empty file.». Идентифицировать, кто конкретно их вписал, нет возможности, но мы почти точно уверены, что это фильтры. И становится понятно, почему принтеру ничего не досталось. Сволочи они.

В общем, связка получилась какая-то кривая. Ставим клиенту драйвер Postscript, рекомендованный. И знаете, оно работает.

Немного поразмышляв, придумываем себе правило номер 1 — слишком много фильтров это плохо. Надо постараться сделать минимальное количество преобразований файла при печати. Т.е. на стороне клиента и на сервере желательно ставить одинаковые драйвера.
Про hplip
Пишут что лучшие результаты даёт драйвер hplip производства Хьюлита-Паккарда. По сути это плугин к купс, и CUPS показывает его как установленный принтер. Строчку для подключения формируем утилитой hp-makeuri, только учтите, что с сетевыми принтерами она работает через протокол JetDirect (tcp/9100). Именно недоступность данного сетевого взаимодействия на моём стенде не дало дописать сюда ещё пару страниц.



Следующий пациент — рикошечка 2352. Это такое относительно небольшое (видал и поболе), но и не маленькое (дома уже не поставить) МФУ. Соответствующих драйверов в коробку с линуксом не положили :(
Про драйвера
Собственно драйвер для конкретной модели принтера понятие несколько надуманное. Сделано для облегчения жизни конечного пользователя, чтобы не вгонять его в сомнения о правильности действий при настройке оборудования.

На самом деле команд/протоколов общения с принтерами весьма ограниченное количество, и различаются железяки между собой прежде всего дизайном и некоторыми дополнительными возможностями: дуплексы, лотки, сшиватели, жесткие диски, софт, встроенные шрифты и т.д.

Вот это всё и описано в «драйверах», в файлах с расширением PPD (Adobe PostScript Printer Description). Это обычный текстовый файл (довольно толстый из-за локализации) с описанием возможностей конкретной модели оборудования. А все стандартные низкоуровневые управляющие команды языков (PCL, PS, HP-GL, ESC/P и т.д.) печатной техники система уже давно знает.

Также, началось активное продвижение IPP Everywere, т.е. один драйвер на всё. Не сильно погружался, но думаю, что это либо сильно упрощённая и урезанная по своим возможностям печать, либо опрос у конечного оборудования какие суперспособности оно имеет. В любом случае пока мимо — первое неудобно, второе в больших конторах пока не применимо из-за возраста железа.
Не беда, файлы ppd для данной МФУ находятся на openprinting и разложены по каталогам PXL, PS,… Заглядывайте при необходимости, там ещё есть и не только для Ricoh.

Как обычно заводим на сервере очередь (в терминах купса это принтер...) и подгружаем туда
«драйвер» для Postscript. Мы так уже привыкли. Запускаем тест печати, глянули логи — всё отлично, идём к аппарату.

А там пусто, неужели кто-то утащил наш документ? Опять читаем логи сервера и ничего подозрительного там тоже не видно, всё отработано и передано нашему аппарату. Штош, полистаем сенсорный экран на МФУ. Видим, что наши тестовые странички улетели в журнал ошибок с кодом 91 — ошибка данных. Лечить это мы не будем, т.к. официального сервиса нет и не предвидится.

Помните, у нас ведь в запасе ещё пара-тройка драйверов — пробуем сначала мягкие методы. Берём ppd файл из каталога PXL, устанавливаем, запускаем проверочную страничку и получаем желаемую распечатку. Переходим на клиента. Вспоминаем наше правило №1 и ставим драйвер «PXL», который сразу же отказался сотрудничать :)

На сервере печати задание вывалилось с ошибкой фильтра.
Про фильтры
Фильтр это фактически основная фишка купса. Конечно они были и раньше, например мне давным-давно приходилось через пайпы фильтровать файлы на вход lpr, но купс спрятал все эти кишочки от пользователя и теперь видим их только мы, сисадмины. Как применять фильтры определяет файл mime.convs — читаем man, ищем в системе файлы '.convs'. Всё просто и понятно, вот только значение поля cost неочевидно. В интернетах пишут, что оно определяет «цену» фильтра от 0 до 100. Предположу что если найдётся цепочка фильтров преобразований с суммарной стоимостью менее чем фильтр, делающий то-же самое, но в одиночку, то купс предпочтёт прогнать данные именно через эту цепочку.

Что делать если купс в логах рисует фильтры, которые в конфигурационных файлах вы не нашли? Правильно, заглянуть в файл PPD — там тоже это встречается :)

Ниже привожу кусочек из файла Ricoh-Aficio_MP_2352_PXL.PPD

*cupsVersion:      1.1
*cupsManualCopies: False
*cupsCommands:     ""
*cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip"
*cupsFilter: "application/vnd.cups-pdf 0 foomatic-rip"

*FoomaticRIPCommandLine: "(printf '\033%%-12345X@PJL\n@PJL JOB\n@PJL SET COPIES=&copies;\n'%G|perl -p -e "s/\x26copies\x3b/1/");
(gs -q -dBATCH -dPARANOIDSAFER -dNOPAUSE -dNOINTERPOLATE %B%A%C %D%E | perl -p -e "s/^\x1b\x25-12345X//" | perl -p -e "s/\xc1\x01\x00\xf8\x31\x44/\x44/g");
(printf '@PJL\n@PJL EOJ\n\033%%-12345X')"
*End

*FoomaticRIPUserEntityMaxLength: 8

Дальше чтение логов как на стороне клиента, так и на стороне сервера, осмотр файла в спуле, ну и краткий вывод — сервер ожидал на входе vendor.cups-postscript, а получил что-то ему неизвестное. Ну как неизвестное — я посмотрел внутренности файла в спуле, вполне себе postscript, только в начале добавка PJL (язык управления заданиями). Вот это-то и не понравилось фильтру.

авг 30 16:18:13 cupsd[6597]: [Job 66] Cannot process \"/var/spool/cups/d00066-001\": Unknown filetype.
авг 30 16:18:13 cupsd[6597]: [Job 66] Process is dying with \"Could not print file /var/spool/cups/d00066-001
авг 30 16:18:13 cupsd[6597]: [Job 66] \", exit stat 2

Ставим на клиента чистый драйвер postscript, от которого отказались на сервере — работает. Отсюда правило №2 — правила №1 не существует, есть только рекомендация №1 :)

Велик соблазн отрубить на сервере все эти драйвера / фильтры и использовать raw-очереди — всё равно клиент уже подготовил данные в необходимом формате. Но в логах сервера получаем запись «Queue printer is a raw queue, which is deprecated.», которая как-бы намекает, что это быстрое решение, но не правильное. В свежую систему тащить легаси некомильфо. В списках рассылки купса этому есть пояснение.

И напоследок, ещё одна довольно полезная, на мой взгляд, опция: в файле /etc/cups/cupsd.conf найдите JobPrivateValues и поставьте значение none. Таким образом, в интерфейсе управления cups будут отображаться нормальные значения имени пользователя и названия задания.

▍ Финал


Вот коротенько и всё, что я хотел написать про CUPS, а также где и как разбираться с отказами печати. И, разумеется, этими двумя случаями траблы не исчерпываются — впереди ещё много железа и софта с их уникальными глюками. Ну а если кто помнит старину ГГ, заголовок статьи — это не проклятие, а весьма душевное приветствие :)
Конкурс статей от RUVDS.COM. Три денежные номинации. Главный приз — 100 000 рублей.

Комментарии (28)


  1. DMGarikk
    29.08.2022 12:16
    +21

    всегда меня поражало то что, что в винде что в линуксе, принтеры и печать это сплошное поле из граблей
    и история 'job completed' или повисшие насмерть джобы в спулере (да так что вообще ничего печатать нельзя, хотя по мониторингу все ок) меня приследовали что в винде что в cups-e

    почему блин… ну почему…


    1. Iv38
      29.08.2022 16:46
      +3

      Потому что принтеры созданы в основном для нанесения страданий человечеству. А ещё они иногда печатают.

      Это касается не только очередей печати, но и самих принтеров. Какой аспект не возьми, там полно граблей и проблем.


    1. ReadOnlySadUser
      29.08.2022 16:56
      +1

      Наверное печать документов - это нечто сложнее, чем отправить ракету в космос. Иначе я это объяснить не могу. У нас уже беспилотные автомобили по улицам ездят, а печать... печать никогда не меняется.


  1. mayorovp
    29.08.2022 12:24
    +1

    Хм, сколько я видел ругани в адрес виндовой реализации сетевых принтеров, драйвера к которым зачем-то должны ставиться и на сервер, и на клиент — а тут внезапно оказалось что и на линуксах та же самая ерунда.


    Неужели так никто и не придумал протокола, который бы позволил существовать драйверу только в одном месте?


    1. maledog
      29.08.2022 13:40
      +1

      Ну. Можно подумать все следуют общепринятым стандартам. Всегда найдется "кривой" pdf. То же самое и с системами печати и драйверами и прошивками принтера. Покупка нового принтера в зоопарк почти всегда пляска с бубном.

      Преимущество CUPS в данном случае заключается в том, что можно хоть под каждый принтер держать свою версию CUPS, с которой принтер работает лучше всего.


    1. bo4kare8
      29.08.2022 15:28
      +1

      так и работает в линуксе в cups. Здесь автору понадобился 2-й cups чтобы ограничить доступ к принтерам напрямую


    1. mapnik
      29.08.2022 18:50

      Для печати на CUPS-сервер на вендоклиенте на самом деле нужно установить всего один драйвер — MS Postscript.
      Никогда не подводит.

      Ну а на линуксах Postscript — и так практически формат печати по умолчанию, так что вопрос лишь в доставке результирующего файла на сервер печати.


      1. teakettle
        30.08.2022 10:44

        Класс! А финишер в этом случае работать будет?


        1. klirichek
          30.08.2022 13:09

          Там в PPD как раз описаны дополнительные возможности. И команды, которые нужно инжектить в вывод, чтобы этот самый результат получить.

          Я так когда-то брутил вывод от виндовых заданий с задействованием финишера, степлера и прочего тюнинга, находил в заголовке, как именно включаются нужные фичи. А потом прописывал в ppd, и в результате на линуксе стало можно использовать всё то же самое.


          1. teakettle
            30.08.2022 13:29

            В том-то и дело, что в PPD - прописаны, а в упомянутом MS Postscript - нет.

            Больше того, я наступал на грабли, когда при установке сетевого принтера (кажется под винду семерку, либо ее серверного современника) это детище микрософта говорит "А у меня уже есть дрова именно под такой принтер, давай поставим их?". Дрова встали, все прекрасно работало, ровно до тех пор, пока юзер не пришел с вопросом "Как мне скрепить листочки в финишере?". Выяснилось, что микрософтовая дровина про дополнительное оборудование не знает ничего, в отличие от родной дровины от коницы. В родной дровине опционное оборудование (финишеры, доп. лотки, колодыры и прочие сортировщики) надо включать ручками, а в микрософтовой оно не включается никак. Совсем.


            1. klirichek
              30.08.2022 13:33

              Насколько помню, там вроде можно взять MS ps и поставить кастомный PPD.

              Но я делал с фильтром для pcl.


              1. teakettle
                30.08.2022 13:51

                Насколько помню, там вроде можно взять MS ps и поставить кастомный PPD.

                Т.е. собрать уникальный драйвер под уникальный принтер. Чем это отличается от установки драйвера от производителя?

                А если принтеры в конторе разные? На одном стоит недофинишер, который может лепить только угловые скрепки, на другом - полноценный буклетчик, на третьем - только лоток разделения работ, который ни скреплять, ни дырявить бумажки не умеет. Получается под каждый из принтеров нужен свой драйвер с уникальным функционалом. И зачем в этой схеме MS PS?

                Его применение оправдано, если из оборудования есть, условно, HP LJ 1100 и все - он может либо печатать, либо не печатать. Если принтер немного сложнее (например в третьем лотке лежат бланки грамот плотностью 145 г/м^2) - универсальному драйверу уже не объяснишь, что бумагу формата А4 надо брать не из 1, а из 3 лотка. Увы.


                1. klirichek
                  30.08.2022 13:58

                  Тут два момента - во-первых, беседовать начали с "MS никогда не подводит". Если он такой супер-надёжный (а драйвера производителя подвели) - то правка PPD, чтобы использовался MS, но при этом задействовались возможности принтера - это вполне вариант.

                  А второй момент - драйвера может просто не быть. У меня был линукс с каким-то generic pcl фильтром на cups. Была винда с драйверами от производителя. И было желание научить линукс пользоваться всеми теми свистелками, которые умеет винда. По итогу да, кастомизация ppd помогла с этим справиться.


  1. vesper-bot
    29.08.2022 12:34
    +2

    Про ГГ — там слегка не так было, по крайней мере, одинаковая форма использовалась и при приветствии, и когда вожди видели врага. Но спасибо за момент ностальгии :)


  1. bo4kare8
    29.08.2022 12:40

    Добавил бы про про обновление и синхронизацию версий cups на клиентах и cups-сервере.
    И откат если что ). А в остальном - хороший рабочий вариант


  1. V1tol
    29.08.2022 13:36

    Т.е. на стороне клиента и на сервере желательно ставить одинаковые драйвера.

    По-моему сразу было очевидно, что это плохая идея. Драйвер самого принтера общается с физически подключённым принтером на его специфическом языке. А удалённый клиент общается не напрямую с принтером, а с CUPS сервера. В принт серверах это же ключевая идея - помучиться, но настроить все принтеры один раз в одном месте, а все остальные печатают пользуясь стандартными драйверами.


    1. DMGarikk
      29.08.2022 13:41
      +2

      тут помому виноваты производители принтеров в большей степени, которые почемуто начинают пилить стандартные настройки типа масштабирования и проч. в обход базовых механизмов и полей протокола.
      типа есть поле 'ориентация' — нет, не пойдёт, мы сделаем внутри еще кастомный раздел где красивыми картинками будет выбираться эта ориентация, и отправляться на принтер через проприетарные поля и в своем закрытом формате… в итоге на клиенте должен быть 'родной драйвер' который компилит этот документ именно в формате принтера со всеми этими 'правильными галочками'… просто потому что без него заполнить эти поля нельзя чтобы на сервере всё разрулилось.


  1. nikweter
    29.08.2022 14:10
    +1

    Вы указали про соблазн включить raw на сервере. Я, когда сталкивался с необходимостью печатать через удаленный CUPS, пришел к включении этого на клиенте. Если на сервере установлены драйвера и все нормально печатает, то lpadmin -p name -m raw на клиенте по моему опыту избавляет от всяческих проблем.


  1. Writer
    29.08.2022 16:13

    Тема с raw неочевидна, но на самом деле это довольно логично: при удалённой печати фильтрация и бэкенд должны быть на одной стороне, а не сразу на двух. На сервере добавляем принтер как raw, а на клиенте - уже с нормальным драйвером. Мне это помогло.


    1. alef13 Автор
      30.08.2022 21:54

      в том то и дело, что raw не нужен на сервере - ведь именно он общается с железом напрямую. С другой стороны клиент тоже должен понимать что умеет принтер.


  1. 13werwolf13
    30.08.2022 05:59
    +2

    к чему к чему а вот к cups у меня никогда не было претензий, ни разу не подвёл (хотя была инсталяция с центральным cups на который заведены все принтеры большого предприятия (более 50 принтаков)). а вот к самим принтерам и их драйверам претензий валом.
    печать в линуксе ещё не боль, боль это сканирование!


    1. ogost
      30.08.2022 11:20

      С принт серверами дел не имел, но ранее у меня без танцев с бубнов локальный принтер с купсом завести не удавалось. В конце-концов конечно заводилось, но танцы были, да. Но вот буквально пару месяцев назад подключал сетевой принтер, завелось со второй попытки, так что прогресс явно налицо.


  1. radroxx
    30.08.2022 11:43
    +1

    На конторе где я работал, меня возня с драйверами на HP принтер задолбала на столько, что я написал скрипт. Скрипт крутился на сервачке в офисе, читал в 1 поток pdf файлики из телеграм бота, другие форматы нельзя ему было отправлять, потом перегонял pdf в postscript и засылал прямо в принтер ncat-ом. Все это добро упаковал в докер контейнер и радовался жизни. Работало все замечательно и возни с драйверами больше не было. Печатаешь в pdf отправляешь pdf в телеграм бота получаешь документ из принтера, мастхевом было что можно было отправить откуда угодно, получил на email билет к примеру тут же на телефоне переслал в телеграм бота получил напечатанный док.
    А с сканером удалось решить вопрос на том же сервачке, взял первый попавшейся веб интерфейс для сканирования и всеми необходимыми драйверами, запаковал все в тот же докер. Если нужно отсканить док просто ложишь его на сканер идешь на url выбираешь все параметры как и в обычном интерфейсе и тыкаешь кнопку скан, через пару секунд скачивается jpg/pdf/png/tiff в зависимости от того что выбрал.
    Не драйверов на клиенте не возни с драйверами на сервере, просто запускаешь пару докер образов и все работает.


  1. Polaris99
    30.08.2022 12:28
    +1

    Я, конечно, дико извиняюсь, но в процессе импортозамещения уже закупили партию российских принтеров?


  1. mazeoff
    30.08.2022 13:39
    +2

    Заодно зацените схему, делал в отечественном редакторе Автограф под линукс :)

    Как раз провожу апробацию этого ПО, куча багов и весь скопирован с британского популярного сервиса


    1. alef13 Автор
      30.08.2022 21:56

      посмотрел - действительно, стандартное российское импортозамещение :)


  1. StriganovSergey
    30.08.2022 13:56
    +2

    Я, даже несколько лет назад, для одного банка под винду на C++ принт-сервер написал, со своей очередью печати, историей распечатанных документов, и с поиском по ним, с рассылкой уведомлений и прочее и прочее.
    Тогда платежки сотнями печатали, и пачка листов должна была идти строго по порядку, т. е. если произошел любой сбой (отказ принтера, отключение сетей, все-что-угодно), то нужно продолжить печать в правильном порядке, с нужного документа, а не всю пачку на несколько сот листов ставить повторно.
    Поэтому, все задачи сначала сохранял в файловый каталог, а потом оттуда печатал по очереди, с контролем ошибок.
    Все еще не опубликовал проект сервера, ни с открытым исходником, ни с закрытым.
    Кроме нехватки времени, у меня по этому проекту еще слишком много не решенных вопросов в части того что и как оформить в плане лицензирования.

    И да, как советуют в статье — применял разделение сетей: принтеры в одной, клиенты в другой, а посередине — сервер.
    И да, как указывали в комментариях — производители принтеров бывают в конец одуревшие, пишут лютую дичь в драйверах, но и на такой случай есть обходные решения.


  1. chubinmax
    31.08.2022 06:24
    +1

    Коллеги, в настоящее время возюкаюсь с написанием виртуального принтера под российские версии линуксов. Идея как раз в том, чтобы у клиентов стоял только один принтер, который перехватывает задание печати в виде PDF файла + описание задания (копии, коллэйты, дуплекс, разрешение и пр..) отправляет это все на сервер печати, а там задание проходит аудит безопасников, затем проверяются квоты юзера, затем задание висит в очереди до востребования. А юзер подходит к любому МФУ в офисе, авторизуется и получает свое задание именно на этом принтере. Все в общем-то работает, но есть вопросы по работе конвеера CUPS. Пытался юзать CUPS API для получения описания задания... выяснилось что росс линуксы чихать хотели на описание задания и CUPS API. Как собирали CUPS и зачем там все порезали хз, но API из пары десятков полей возвращает малую часть. В итоге, пришлось парсить файл описания задания чтобы получить нужную инфу. Дальше веселее, ответа пока не нашел - несмотря на то, что в своем виртуальном принтере я установил его как PDF принтер, в некоторых приложениях типа Libre Office Calc вывод задания можно выполнить в формате PS.
    При этом в файл описания печатного задания CUPS не кладет поля Copies и Collate. И вроде фигня - отпарсить PS файл, вынуть оттеда Copies и Collate и конвертнуть ps2pdf перед отправкой файла...
    Но собака тут и порылась поле Copies в PS файле задания есть, а вот поля Collate нет! Т.е. оно просто теряется...
    Я генерил PS файлы на разных версиях Линуха: Red Os, Astra... ситуация повторяется 1:1.
    ЧЯДНТ!??
    Научите дурака...