Вопрос или проблема
У меня проблемы с тем, как добавить фильтр для необработанной очереди в CUPS – если это возможно.
По сути, что мне нужно сделать, так это конвертировать TIFF в PS перед отправкой его в необработанную очередь. Принтер не поддерживает TIFF, поэтому выходные данные выходят нечитабельными.
Мне нужно оставить настройку принтера в виде необработанной очереди и не могу добавить вторую печатную очередь для этого же принтера для фильтрации.
Есть ли какой-то способ захватить TIFF файл (желательно для одного принтера) и конвертировать его в PS перед отправкой в необработанном виде?
Это будет что-то, что я сделаю в mime.convs для необработанного приложения?
Я нашел решение этой проблемы. По сути, я создаю новый принтер с собственным бэкендом, который позволяет мне манипулировать входящими данными перед тем, как снова их отправить. Таким образом, у меня есть один принтер, выступающий в роли обертки, который получает данные, конвертирует изображение, а затем отправляет его на фактический принтер.
Для этого есть пакет RPM openSUSE, который предоставляет CUPS pipe backend, который можно использовать с CentOS. Этот бэкенд используется как конвейер командной строки.
Я скачал вышеупомянутый RPM и извлек скрипт конвейера. Этот скрипт скопирован в /usr/lib/cups/backend/pipe
и сделан исполняемым.
Затем я написал небольшой скрипт, который будет принимать информацию о печати, включая параметры принтера из URI принтера. Этот скрипт выполняет конвертацию изображений (для этой задачи TIFF в PDF), если это необходимо, а затем отправляет его на фактический принтер.
#!/bin/bash
FILE=${PIPE_BACKEND_ARGV6}
MIME_TYPE=$(file --mime-type "${FILE}" | awk '{print $2}')
if [[ $MIME_TYPE == *tiff ]]
then
tiff2pdf -o /tmp/printConv-$$.pdf "$FILE"
FILE=/tmp/printConv-$$.pdf
CONV=1
fi
lpr -P "$1" "${FILE}"
if [[ $CONV -eq 1 ]]
then
rm "${FILE}"
fi
Затем я настроил “обертку” принтера с помощью следующего синтаксиса URI:
pipe:/path/to/cups-wrapper-script?actualPrinterName
Здесь используется бэкенд конвейера. Он вызывает скрипт по адресу /path/to/cups-wrapper-script
с аргументом actualPrinterName
, который используется для указания скрипту, на какой фактический принтер отправить задание.
Мне интересно ваше решение. Мне нужно что-то похожее для моего матричного принтера, потому что он принимает только текстовые файлы, и мне нужно конвертировать все, что он получает в PDF, в текст перед отправкой на печать. Я пробовал фильтры и бэкенды, сгенерированные с помощью GPT, но CUPS не удается их обработать.
Ответ или решение
CUPS Фильтр для сырого очереди печати
Введение
CUPS (Common Unix Printing System) предлагает мощный и гибкий механизм для управления печатью в UNIX-подобных операционных системах. Однако, если ваша задача заключается в том, чтобы использовать "сырой" (raw) режим печати, и вам необходимо предварительно обрабатывать файлы (например, конвертировать TIFF в PostScript), то применение CUPS может показаться сложным.
Проблема
Вы хотите настроить фильтр для сырой очереди печати, который будет преобразовывать файлы TIFF в формат PS перед отправкой на принтер. Однако ваш принтер не поддерживает TIFF и вы не можете создать отдельную очередь для этого. Это ограничивает возможности CUPS, так как обычные фильтры и обработка данных могут быть недостаточно гибкими для ваших нужд.
Решение
Оптимальным подходом к решению данной проблемы является создание "обертки" для очереди печати с помощью пользовательского бэкенда, который позволит вам манипулировать входящими данными до их отправки на принтер. В данном случае, мы будем использовать механизм CUPS pipe backend. Этот подход также можно адаптировать для других типов работы с данными, например, для вашей матричной принтера, который поддерживает только текстовые форматы.
Шаги для реализации решения:
-
Установка CUPS Pipe Backend
Вы можете использовать пакет от openSUSE, который предоставляетcups-backends
. Сначала загрузите и установите RPM:wget http://download.opensuse.org/distribution/13.1/repo/oss/suse/x86_64/cups-backends-1.0-275.1.2.x86_64.rpm rpm -i cups-backends-1.0-275.1.2.x86_64.rpm
-
Экстракция и настройка Pipe Script
Извлекитеpipe
скрипт из пакета и скопируйте его в нужную директорию:cp /path/to/extracted/pipe /usr/lib/cups/backend/ chmod +x /usr/lib/cups/backend/pipe
-
Создание конвертерного скрипта
Создайте новый bash скрипт, который будет обрабатывать входящие файлы, определять их тип и выполнять конвертацию:#!/bin/bash FILE=${PIPE_BACKEND_ARGV6} MIME_TYPE=$(file --mime-type "${FILE}" | awk '{print $2}') if [[ $MIME_TYPE == *tiff ]]; then tiff2pdf -o /tmp/printConv-$$.pdf "$FILE" FILE=/tmp/printConv-$$.pdf CONV=1 fi lpr -P "$1" "${FILE}" if [[ $CONV -eq 1 ]]; then rm "${FILE}" fi
-
Настройка "обертки" для принтера
Создайте новую принтерскую очередь с использованием URI, указывающего на ваш скрипт:pipe:/path/to/cups-wrapper-script?actualPrinterName
Здесь
actualPrinterName
– это имя вашего реального принтера.
Применение для других форматов
Для вашего случая с матричным принтером, вы можете аналогично создать скрипт, который будет конвертировать PDF в текстовый формат перед отправкой на принтер. Используйте инструменты, такие как pdftotext
, чтобы обработать файл:
pdftotext "${FILE}" /tmp/printConv-$$.txt
lpr -P "$1" /tmp/printConv-$$.txt
Заключение
Создание кастомного бэкенда с использованием CUPS Pipe backend – это мощное решение для гибкой обработки данных перед печатью, позволяющее удовлетворить специфические требования к конвертации. Надеюсь, это поможет вам решить вашу задачу с печатью TIFF файлов и аналогичные случаи преобразования форматов перед отправкой на принтер.