java linux bash printing cups

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