Есть ли способ явно сообщить серверу CUPS, что файл, который вы отправляете, является text/html
, таким образом переопределяя поиск mime.types?
Распечатать html-файл с помощью CUPS
Ответы (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) не могут быть успешно преобразованы простыми инструментами командной строки в готовые к печати форматы.
Если вам нужна дополнительная информация об этом, просто задайте другой вопрос...
lpr -P printername -o document-format=text/html file.html
- person Kurt Pfeifle; 24.01.2014
file.html
тогда? (Кстати, обычно вам никогда не нужно указывать document-format
, потому что CUPS по умолчанию выполняет автоматическую привязку всех полученных файлов печати. Но вопрос ОП был: < i>как явно переопределить встроенную функцию автоматического ввода CUPS, и вот что сказал ему мой ответ...)
- person Kurt Pfeifle; 24.01.2014
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
lpr
. lp
также должен работать с теми же результатами, что и lpr
...
- person Kurt Pfeifle; 24.01.2014
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
lp: Bad page-ranges values 0-0.
мой путь. Указание -o page-ranges=1
не помогло.
- person Maciej Gurban; 24.01.2014