【问题标题】:Pass data from java to cups filter将数据从 java 传递到 cups 过滤器
【发布时间】:2012-11-02 00:36:15
【问题描述】:

我正在开发打印系统,需要向每个打印的文档添加任意文本(如作者、文档哈希、一些 sysvar 等)。我们使用 Java 打印服务 (javax.print) 作为打印客户端,使用 Cups 作为服务器。

Cups 有一些称为“过滤器”的文档后处理程序。

Filter - 是一个程序,将由 Cups 推出。 Cups pass 过滤了一些参数——其中的“工作属性”。

所以,我决定将自定义属性从 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);

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

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

/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...

我的属性:

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

}

【问题讨论】:

  • 您是否使用 MyAttr 正确实现 javax.print.attribute.Attribute ?我不确定它的解决方案,但文档建议你应该这样做。请参阅 java 文档:docs.oracle.com/javase/1.4.2/docs/api/javax/print/attribute/… 还发布您的类 MyAttr 的代码可能会有所帮助。
  • 感谢关注。我认为 MyAttr 实施得当,在我的问题中添加了来源。

标签: java linux bash printing cups


【解决方案1】:

你可以使用cups4j

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

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

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

尝试:

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

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

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 的其他实现

【讨论】:

  • MyAttrSet 已经是 HashPrintRequestAttributeSet。通过“副本”或“边”不是问题。但是传递像“MyAttr”这样的自定义属性不起作用。我正在尝试传递“MyAttr”,因为我需要将很多不同的数据传递给 Cups,甚至在 IPP 规范或打印机驱动程序中都没有提到。
  • 您是否尝试将“PrintJobAttribute”添加为您的 MyAttr 的接口?
  • 是的,我做到了。那没有帮助。顺便说一句,cups4j 通过属性完全没有问题!但我最好不要使用cups4j。我们需要使用标准组件构建所有东西(用于认证)。
  • 好吧,我无法让 javax.print 正常工作(许多程序员不鼓励使用这个 API),所以我们决定使用 Cups4j。但是,如果您知道如何使 javax.print 属性起作用,请在此处发布解决方案。
  • 对不起,我不经常使用 java print,但我认为 cups4j 是一个很好的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 2013-01-08
  • 2011-11-16
相关资源
最近更新 更多