Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据从java传递到cups筛选器_Java_Linux_Bash_Printing_Cups - Fatal编程技术网

将数据从java传递到cups筛选器

将数据从java传递到cups筛选器,java,linux,bash,printing,cups,Java,Linux,Bash,Printing,Cups,我正在处理打印系统,需要向每个打印的文档添加任意文本(如author、documenthash、一些sysvars等)。我们使用Java打印服务(javax.print)作为打印客户端,使用Cups作为服务器 Cups有一些文档后处理过程,称为“过滤器” 过滤器-是一个程序,将由Cups启动。Cups会过滤其中的一些参数——“作业属性” 所以,我决定将自定义属性从java传递到cups,并将属性作为文本添加到过滤器中的文档中。一切正常,文档被打印,但我并没有在过滤器中获取属性。它们甚至没有传递给

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

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

过滤器-是一个程序,将由Cups启动。Cups会过滤其中的一些参数——“作业属性”

所以,我决定将自定义属性从java传递到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...
所有参数:
87, 
奥罗博罗斯,
爪哇印刷,
18,您可以使用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库的文章:

既然你可以打印,我想这不是问题。但我不确定MyAttrSet是什么,它应该是一个HashPrintRequestAttributeSet

尝试:

查看此属性是否已读入,然后尝试将您的属性添加到这样的集合中,它是否有效。 您可能希望尝试实现其他属性:

“侧面”属性如下所示:

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

您是否正确地使用MyAttr实现了javax.print.attribute.attribute?我不确定这是解决办法,但医生建议你这样做。请参阅java文档:同时发布MyAttr类的代码可能会有所帮助。感谢您的关注。我认为MyAttr实现正确,在我的问题中添加了源代码。MyAttrSet已经是HashPrintRequestAttributeSet。传递“副本”或“双方”不是问题。但是像“MyAttr”这样传递自定义属性是不起作用的。我正在尝试传递“MyAttr”,因为我需要向Cups传递许多不同的数据,IPP规范或打印机驱动程序中甚至没有提到。您是否尝试添加“PrintJobAttribute”作为MyAttr的接口?是的,我尝试过。这没有帮助。顺便说一下,cups4j传递属性一点问题都没有!但我最好不要用cups4j。我们需要使用标准组件(用于认证)构建所有内容。我无法使javax.print正常工作(许多程序员不鼓励使用此API),因此我们决定使用Cups4j。但是,如果您知道如何使javax.print属性工作,请在这里发布解决方案。对不起,我不经常使用javaprint,但我认为cups4j是一个很好的解决方案。
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