Распечатать html-файл с помощью CUPS

Есть ли способ явно сообщить серверу CUPS, что файл, который вы отправляете, является text/html, таким образом переопределяя поиск mime.types?


person vonPetrushev    schedule 30.11.2011    source источник


Ответы (1)


Да, есть.

Используйте эту командную строку:

lp -d printername -o document-format=text/html file.html

Обновление (в ответ на комментарии)

Я дал точный ответ на вопрос ОП.

Однако это (само по себе) не гарантирует, что файл будет успешно распечатан. Для этого CUPS нужен фильтр, который может обрабатывать ввод MIME-типа text/html.

Такой фильтр не предусмотрен самим CUPS. Однако легко подключить собственный фильтр к системе фильтрации CUPS, и некоторые дистрибутивы Linux содержат такой фильтр, способный потреблять HTML-файлы и преобразовывать их в формат для печати.

Вы можете проверить, что происходит в такой ситуации в вашей системе. Команда cupsfilter — это вспомогательная утилита для запуска доступных/установленных фильтров CUPS без необходимости фактической печати через демон CUPS:

touch 1.html
/usr/sbin/cupsfilter --list-filters 1.html

Теперь в системе без готового фильтра, потребляющего HTML, вы получите такой ответ:

cupsfilter: No filter to convert from text/html to application/pdf.

В другой системе (например, на Mac) вы увидите следующее:

xhtmltopdf

Вы даже можете принудительно указать типы MIME ввода и вывода, чтобы увидеть, какие фильтры CUPS будут запускаться автоматически при запросе на печать этого файла на принтере, поддерживающем этот конкретный тип MIME вывода (-i устанавливает тип MIME ввода, -m вывод):

/usr/sbin/cupsfilter                  \
            -i text/html              \
            -m application/postscript \
            --list-filters            \
              1.html
  xhtmltopdf
  cgpdftops

Здесь он сначала преобразует HTML в PDF, используя xhtmltopdf, а затем преобразует полученный PDF в PostScript, используя cgpdftops.

Если вы пропустите параметр --list-filters, команда фактически продолжит преобразование, активно запустив (а не просто перечислив) два фильтра и отправив результат в <stdout>.

Вы можете написать свой собственный фильтр CUPS на основе скрипта Shell. Единственный другой ингредиент, который вам нужен, — это инструмент командной строки, такой как htmldoc или wkhtmltopdf,, который способен обрабатывать ввод HTML и создавать некоторый формат, который, в свою очередь, может использоваться цепочкой фильтрации CUPS в дальнейшем.

Имейте в виду, что некоторые HTML-файлы (особенно с большим количеством JavaScript) не могут быть успешно преобразованы простыми инструментами командной строки в готовые к печати форматы.

Если вам нужна дополнительная информация об этом, просто задайте другой вопрос...

person Kurt Pfeifle    schedule 11.02.2012
comment
Что с лпр? Это также возможно? - person Maciej Gurban; 23.01.2014
comment
@DIH: Конечно: lpr -P printername -o document-format=text/html file.html - person Kurt Pfeifle; 24.01.2014
comment
Это интересная проблема, которая у меня есть тогда. В Mac OSX 10.9.1 вывод с принтера при использовании вашего кода — это просто пустая страница. PDF-файлы печатаются идеально, без необходимости указывать формат документа, но при этом все HTML-документы остаются пустыми. - person Maciej Gurban; 24.01.2014
comment
@DIH: Можете ли вы опубликовать (ссылку) на свой file.html тогда? (Кстати, обычно вам никогда не нужно указывать document-format, потому что CUPS по умолчанию выполняет автоматическую привязку всех полученных файлов печати. ​​Но вопрос ОП был: < i>как явно переопределить встроенную функцию автоматического ввода CUPS, и вот что сказал ему мой ответ...) - person Kurt Pfeifle; 24.01.2014
comment
Я также зашел на локальный хост: 631, посетил готовые задания на печать и попытался перепечатать. Он завершился, но распечатка все еще была пустой страницей. Печать того же HTML-документа с помощью Cmd + P печатает его правильно. - person Maciej Gurban; 24.01.2014
comment
Печать из командной строки (lp или lpr) очень отличается от печати из окна браузера ([cmd] + [p]): первый отправляет HTML в CUPS и полагается на систему автоматической фильтрации CUPS для преобразования HTML в язык принтера вашего принтера. Второй говорит браузеру преобразовать HTML в PostScript, а CUPS всегда видит только PostScript, поступающий в его область. Ваша система CUPS может быть не в состоянии обрабатывать HTML. (Попробуйте принудительно напечатать текст, сказав -o document-format=plain/text...) - person Kurt Pfeifle; 24.01.2014
comment
Кстати, вам не нужно настаивать на lpr. lp также должен работать с теми же результатами, что и lpr... - person Kurt Pfeifle; 24.01.2014
comment
Преимущество lp: он печатает идентификатор запроса задания в терминале, а lpr этого не делает. Вы можете использовать идентификатор запроса для поиска того, что есть в журнале: grep "Job 331" /var/log/cups/error_log и grep "Job 331" /var/log/cups/error_log | grep -E '(filter|backend)'... - person Kurt Pfeifle; 24.01.2014
comment
Причина, по которой я остановился на lpr, заключается в том, что lp с теми же параметрами бросает lp: Bad page-ranges values 0-0. мой путь. Указание -o page-ranges=1 не помогло. - person Maciej Gurban; 24.01.2014
comment
давайте продолжим это обсуждение в чате - person Maciej Gurban; 24.01.2014
comment
лол .. яркий пример людей, пытающихся взломать пост другого пользователя .. Продолжить в чате ... Нет ... ах, это сделало мой день - person Angry 84; 19.08.2015
comment
@PeterKandinsky: я добавил в ответ обновление. - person Kurt Pfeifle; 27.04.2016