Передача данных из java в фильтр cups

Я работаю над системой печати и должен добавлять произвольный текст в каждый печатный документ (например, автор, хэш документа, некоторые sysvars и другие). Мы используем службу печати Java (javax.print) как клиент печати и Cups как сервер.

Cups имеет некоторые процедуры постобработки документов, называемые "фильтрами".

Filter-это программа, которая будет запущена Cups. Чашки пропускают фильтр некоторых параметров - "атрибуты задания" среди них.

Так, Я решил передать пользовательские атрибуты из java в cups и добавить атрибуты в виде текста в документ в фильтре. Все работает без исключения, документ печатается, но я не получаю свои атрибуты в фильтре. Они даже не переходят в чашки (видел, что в пакете Нюхач).

Я уже использовал getSupportedAttributeCategories (), чтобы увидеть список поддерживаемых (принтером?) атрибуты. Может быть, я должен как-то добавить свой в этот список, но я не понимаю, как.

Я не ограничиваюсь "атрибуты",мне просто нужно передать данные из java в Cups filter. Как я могу это сделать?

мой java-код выглядит так:

MyAttrSet attrs = new MyAttrSet();
attrs.add(new MyAttr(42));
attrs.add(new Copies(18));  

PrintService service = PrintServiceLookup.lookupDefaultPrintService();
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc doc = new SimpleDoc(is, flavor, null);
DocPrintJob job = service.createPrintJob();

job.print(doc, attrs);

фильтр-это простой скрипт bash, который печатает все переданное ему:

#!/bin/bash
echo "All args:" > /tmp/f1.log
for var in "$@"
do
        echo "$var, " >> /tmp/f1.log
done

/ tmp / f1.журнал выглядит так:

All args:
87, 
oroboros, 
 Java Printing, 
18, <- number of pages is passed! But not MyAttr
some useless crap like job uuid and else...

MyAttr:

class MyAttr extends IntegerSyntax implements PrintRequestAttribute {

    protected MyAttr(int value) {
        super(value);
    }

    public Class<? extends Attribute> getCategory() {
        // TODO Auto-generated method stub
        return MyAttr.class;
    }

    public String getName() {
        // TODO Auto-generated method stub
        return "somemycustop5";
    }

}

1 ответов


вы можете использовать cups4j

Map attributes = new HashMap();
attributes.put("job-attributes", "print-quality:enum:3#media:keyword:iso_a5_148x210mm");
printJob.setAttributes(attributes);

см. следующую статью о том, как обновление CUPS в Linux сломало библиотеки Java и библиотеки CUPS: http://www.cups.org/articles.php?L433+TFAQ+Q

теперь, поскольку вы можете распечатать, я предполагаю, что это не проблема. Но я не уверен, что такое MyAttrSet, это должно быть HashPrintRequestAttributeSet.

попробуй:

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(2));

посмотрите, читается ли этот атрибут, а затем попробуйте добавить свой к такому set, работает это или нет. Возможно, вы захотите попробовать реализовать другие атрибуты:

атрибут Sides выглядит следующим образом:

public class Sides
  extends EnumSyntax
  implements DocAttribute, PrintRequestAttribute, PrintJobAttribute
  {
  public final Object getCategory()
    {
    return Sides.class;
    }
  ...
  }

Аналогично Копий:

public final class Copies
extends IntegerSyntax
implements PrintRequestAttribute, PrintJobAttribute

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