将数据从java传递到cups过滤器

Oro*_*102 6 java linux printing bash cups

我正在研究打印系统,需要在每个打印文档中添加任意文本(如作者,文档哈希,一些sysvars等).我们使用Java Printing Service(javax.print)作为打印客户端和Cups作为服务器.

Cups有一些称为"过滤器"的文档后处理程序.

过滤器 - 是一个由Cups推出的程序.杯子通过过滤一些参数 - 其中的"工作属性".

所以,我决定将自定义属性从java传递到cups并在过滤器中将属性作为文本添加到文档中.一切正常,文档被打印,但我没有在过滤器中获取我的属性.他们甚至没有被传递到Cups(在包嗅探器中看到它).

我已经使用getSupportedAttributeCategories()来查看支持的列表(通过打印机?)属性.也许我应该以某种方式将我添加到该列表中,但我不明白如何.

我不仅限于"属性",我只需要将java中的任意数据传递给Cups过滤器.我该怎么做?

我的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);
Run Code Online (Sandbox Code Playgroud)

Filter是一个简单的bash脚本,它打印传递给它的所有内容:

#!/bin/bash
echo "All args:" > /tmp/f1.log
for var in "$@"
do
        echo "$var, " >> /tmp/f1.log
done
Run Code Online (Sandbox Code Playgroud)

/tmp/f1.log看起来像:

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

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";
    }

}
Run Code Online (Sandbox Code Playgroud)

msj*_*121 3

你可以使用cups4j

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

请参阅以下文章,了解 Linux 上的 CUPS 升级如何破坏 Java 库和 CUPS 库: http://www.cups.org/articles.php?L433+ TFAQ+Q

现在,既然您可以打印,我认为这不是问题。但我不确定 MyAttrSet 是什么,它应该是HashPrintRequestAttributeSet

尝试:

PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(new Copies(2));
Run Code Online (Sandbox Code Playgroud)

看看这个属性是否被读入,然后尝试将你的属性添加到这样的集合中,它是否有效。您可能想尝试实现其他属性:

Sides 属性如下所示:

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

同样的副本:

public final class Copies
extends IntegerSyntax
implements PrintRequestAttribute, PrintJobAttribute
Run Code Online (Sandbox Code Playgroud)

也许尝试添加 PrintJobAttribute 的附加实现