Pasar datos de Java al filtro de tazas
linux bash (1)
Estoy trabajando en el sistema de impresión y necesito agregar texto arbitrario a cada documento impreso (como autor, hash de documento, algunos sysvars y demás). Usamos Java Printing Service (javax.print) como cliente de impresión y Cups como servidor.
Cups tiene algunos procedimientos de postprocesamiento de documentos llamados "filtros".
Filtro: es un programa que lanzará Cups. Los pases de copa filtran algunos params, "atributos de trabajo" entre ellos.
Entonces, decidí pasar atributos personalizados de Java a tazas y agregar atributos como texto para documentar en filtro. Todo funciona sin excepción, el documento está impreso, pero no obtengo mis atributos en filtro. Ni siquiera son pasados a Cups (vi eso en sniffer de paquetes).
Ya utilicé getSupportedAttributeCategories () para ver la lista de atributos compatibles (¿por impresora?). Quizás de alguna manera debería agregar el mío a esa lista, pero no entiendo cómo.
No estoy limitado a "atributos", solo necesito pasar datos arbitrarios de Java al filtro de Copas . ¿Cómo puedo hacerlo?
Mi código de Java es como:
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);
El filtro es un script bash simple, que imprime todo lo que se le pasó:
#!/bin/bash
echo "All args:" > /tmp/f1.log
for var in "$@"
do
echo "$var, " >> /tmp/f1.log
done
/tmp/f1.log se ve así:
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";
}
}
Puedes usar cups4j
Map attributes = new HashMap();
attributes.put("job-attributes", "print-quality:enum:3#media:keyword:iso_a5_148x210mm");
printJob.setAttributes(attributes);
Consulte el siguiente artículo sobre cómo la actualización de CUPS en Linux rompió las bibliotecas Java y las bibliotecas CUPS: http://www.cups.org/articles.php?L433+TFAQ+Q
Ahora, como puedes imprimir, supongo que no es un problema. Pero no estoy seguro de qué es MyAttrSet, debería ser un HashPrintRequestAttributeSet .
tratar:
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(2));
Vea si se lee este atributo, luego intente agregar el suyo a dicho conjunto, funciona o no. Es posible que desee probar la implementación de otros atributos:
El atributo lados se ve así:
public class Sides
extends EnumSyntax
implements DocAttribute, PrintRequestAttribute, PrintJobAttribute
{
public final Object getCategory()
{
return Sides.class;
}
...
}
Copias similares:
public final class Copies
extends IntegerSyntax
implements PrintRequestAttribute, PrintJobAttribute
quizás intente agregar los implementos adicionales de PrintJobAttribute