Фильтр CUPS для сырой очереди

Вопрос или проблема

У меня проблемы с тем, как добавить фильтр для необработанной очереди в 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. Этот подход также можно адаптировать для других типов работы с данными, например, для вашей матричной принтера, который поддерживает только текстовые форматы.

Шаги для реализации решения:

  1. Установка 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
  2. Экстракция и настройка Pipe Script
    Извлеките pipe скрипт из пакета и скопируйте его в нужную директорию:

    cp /path/to/extracted/pipe /usr/lib/cups/backend/
    chmod +x /usr/lib/cups/backend/pipe
  3. Создание конвертерного скрипта
    Создайте новый 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
  4. Настройка "обертки" для принтера
    Создайте новую принтерскую очередь с использованием 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 файлов и аналогичные случаи преобразования форматов перед отправкой на принтер.

Оцените материал
Добавить комментарий

Капча загружается...