Передача данных из 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