7

私は印刷システムに取り組んでおり、印刷された各ドキュメントに任意のテキストを追加する必要があります (作成者、ドキュメント ハッシュ、いくつかの sysvar など)。Java 印刷サービス (javax.print) を印刷クライアントとして使用し、Cups をサーバーとして使用します。

Cups には、「フィルター」と呼ばれるドキュメントの後処理の手順がいくつかあります。

Filter - 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);

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

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

}
4

1 に答える 1

3

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の実装を追加してみてください

于 2012-11-21T19:17:56.907 に答える