2012-04-10 36 views
3

物理的にページ(および/またはジョブ全体)の印刷が完了したら、ネットワークプリンタから通知を受け取ることができます。これは、私がWeb経由で印刷管理用に書いているアプリで使用される予定であり、ユーザーはページごとに課金されるため、ページが実際に完了する前に料金が下がるべきではない。物理ページ/ジョブが完了したときにプリンタから通知を受け取る方法

ドライバ、プラグイン、クライアントアプリケーションのどちらを作成する必要があるかわかりません。クライアントはまだ書かれていないので、自分のプラットフォームに柔軟に対応しているので、WindowsまたはLinuxのいずれかのプログラミング言語/レベルの適切なソリューションについて聞きたいと思います。

私は、スプーラとプリンタに違いがあることを認識しています。私は、ページまたはジョブが物理的に完了したときに、プリンタがIPPを介してマシンに通知するレベルを調べようとしています。

私は現在、とき代わりIPPプロパティjob-impressions-completed変更、または通知を得るためにそれのための投票をjspicups4jパッケージのいずれかを使用して、Javaのに探しています。私はCUPS IPPインターフェイスをローカルプリンタに使用しています。シンプルなテスター(HelloPrint.java、またはCupsTest.javaがcups4jに含まれています)を実行しても、私はポーリング時に属性の変更を受け取りませんでした。

だからここに質問されています

  • は、この権利をやっていますか?そうでない場合は、どうすればいいですか?
  • これはローカルプリンタへのCUPSインターフェイスなので、具体的には実際のプリンタのスプーラとして機能するため、job-impressions-completed属性が更新されていない可能性があります。実際のプリンタは、がこの属性を通知またはリストすると仮定すると、プリンタ固有か、でなければなりません。

システム情報:Ubuntuの11.10、CUPS 1.5.0には、プリンタであるブラザーHL-2240D(PPD available here

注:HL-2240Dはない私は最終的なプロジェクトのために使用されるプリンタです(具体的には、IPPをサポートしていません)。 HP HL4250DNまたはSamsung 3741NDなどのいずれかを使用する予定です。それがすべてのプリンタのファームウェアに依存最後に

HelloPrint.java

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.net.URI; 
import java.net.URISyntaxException; 
import java.util.Date; 

import javax.print.*; 
import javax.print.attribute.*; 
import javax.print.attribute.standard.*; 
import javax.print.event.*; 

import de.lohndirekt.print.IppPrintService; 

public class HelloPrint { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // create request attributes 
     PrintRequestAttributeSet requestAttributeSet = new HashPrintRequestAttributeSet(); 
     requestAttributeSet.add(MediaSizeName.ISO_A4); 
     requestAttributeSet.add(new Copies(1)); 
     requestAttributeSet.add(Sides.DUPLEX); 

     // find an appropriate service 
     // using jspi (http://code.google.com/p/jspi/) 
     URI printerURI; 
     try { 
      printerURI = new URI("ipp://localhost:631/printers/HL2240D-local"); 
     } catch (URISyntaxException e2) { 
      e2.printStackTrace(); 
      return; 
     } 
     IppPrintService service = new IppPrintService(printerURI); 

     // by enumerating  
     //  PrintService[] services = PrintServiceLookup.lookupPrintServices(
     //    DocFlavor.INPUT_STREAM.PDF, requestAttributeSet); 
     //  for (PrintService service1 : services) { 
     //   System.out.println(service1); 
     //  } 
     //  PrintService service = services[0]; 

     // add listeners to service 
     service.addPrintServiceAttributeListener(new PrintServiceAttributeListener() { 
      @Override 
      public void attributeUpdate(PrintServiceAttributeEvent event) { 
       PrintServiceAttributeSet serviceAttributeSet = event 
         .getAttributes(); 
       StringBuilder s = new StringBuilder(); 
       s.append("=== PrintServiceAttributeEvent: (" + serviceAttributeSet.size() + " attributes)\n"); 
       for (Attribute attribute : serviceAttributeSet.toArray()) { 
        PrintServiceAttribute printServiceAttribute = (PrintServiceAttribute) attribute; 

        s.append(printServiceAttribute.getCategory().getName() 
          + "/" + printServiceAttribute.getName() + " = " 
          + printServiceAttribute.toString() + "\n"); 

       } 
       System.out.println(s.toString()); 
      } 
     }); 

     // add file (blank.pdf is a blank page exported as PDF from LibreOffice 
     // Writer) 
     FileInputStream inputStream; 
     try { 
      inputStream = new FileInputStream("blank.pdf"); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      return; 
     } 

     // create a new doc and job 
     DocAttributeSet docAttributeSet = new HashDocAttributeSet(); 
     docAttributeSet.add(MediaSizeName.ISO_A4); 
     docAttributeSet.add(Sides.DUPLEX); 

     Doc doc = new SimpleDoc(inputStream, DocFlavor.INPUT_STREAM.PDF, 
       docAttributeSet); 

     DocPrintJob job = service.createPrintJob(); 

     // listen to print job attribute change events 
     // attribute set is null, means this means to listen on all dynamic 
     // attributes that the job supports. 
     job.addPrintJobAttributeListener(new PrintJobAttributeListener() { 
      @Override 
      public void attributeUpdate(PrintJobAttributeEvent event) { 
       PrintJobAttributeSet jobAttributeSet = event.getAttributes(); 
       StringBuilder s = new StringBuilder(); 
       s.append("=== PrintJobAttributeEvent: (" + jobAttributeSet.size() + " attributes)\n"); 
       for (Attribute attribute : jobAttributeSet.toArray()) { 
        PrintJobAttribute jobAttribute = (PrintJobAttribute) attribute; 

        s.append(jobAttribute.getCategory().getName() + "/" 
          + jobAttribute.getName() + " = " 
          + jobAttribute.toString() + "\n"); 

       } 
       System.out.println(s.toString()); 

      } 
     }, null); 

     // listen to print job events 
     job.addPrintJobListener(new PrintJobListener() { 

      @Override 
      public void printJobRequiresAttention(PrintJobEvent pje) { 
       System.out.println("=== PrintJobEvent: printJobRequiresAttention"); 
      } 

      @Override 
      public void printJobNoMoreEvents(PrintJobEvent pje) { 
       // TODO Auto-generated method stub 
       System.out.println("=== PrintJobEvent: printJobNoMoreEvents"); 
       System.out.println(pje.getPrintEventType()); 
       System.out.println(pje.toString()); 
      } 

      @Override 
      public void printJobFailed(PrintJobEvent pje) { 
       // TODO Auto-generated method stub 
       System.out.println("=== PrintJobEvent: printJobFailed"); 
       System.out.println(pje.getPrintEventType()); 
       System.out.println(pje.toString()); 
      } 

      @Override 
      public void printJobCompleted(PrintJobEvent pje) { 
       // TODO Auto-generated method stub 
       System.out.println("=== PrintJobEvent: printJobCompleted"); 
       System.out.println(pje.getPrintEventType()); 
       System.out.println(pje.toString()); 
      } 

      @Override 
      public void printJobCanceled(PrintJobEvent pje) { 
       // TODO Auto-generated method stub 
       System.out.println("=== PrintJobEvent: printJobCanceled"); 
       System.out.println(pje.getPrintEventType()); 
       System.out.println(pje.toString()); 
      } 

      @Override 
      public void printDataTransferCompleted(PrintJobEvent pje) { 
       System.out.println("=== PrintJobEvent: printDataTransferCompleted"); 
       System.out.println(pje.getPrintEventType()); 
       System.out.println(pje.toString()); 
      } 
     }); 

     // print 
     try { 
      job.print(doc, requestAttributeSet); 
     } catch (PrintException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
      return; 
     } 

     // try polling 
     while (true) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
       return; 
      } 

      System.out.println("=== Polling: I'm alive and it's " + new Date()); 
      System.out.println("Job attributes"); 
      for (Attribute attribute : job.getAttributes().toArray()) { 
       System.out.println((attribute.getCategory().getName() + "/" 
         + attribute.getName() + " = " + attribute.toString())); 
      } 
      System.out.println("Service attributes"); 
      for (Attribute attribute : service.getAttributes().toArray()) { 
       System.out.println((attribute.getCategory().getName() + "/" 
         + attribute.getName() + " = " + attribute.toString())); 
      } 
     } 
    } 

} 
+0

「実際の印刷ジョブの進捗状況を監視するにはどうすればよいですか」というのは適切な質問です。私はあなたのコメントを考慮に入れました。うまくいけば、このバージョンの質問はより明確になりました(おそらく答えられるかもしれません)。 – Yuval

+0

あなたの改訂された質問は完全に適切です。 (実質的な)編集に感謝します。今はずっと良いです。 :) –

+0

こんにちはYuval、あなたの質問への答えを見つけることができますか? 私はexcatly同じ要件があり、まだ解決策を見つけることができませんでした。 –

答えて

2

はここjavax.printパッケージとjspiを使用してサンプルアプリです。 IPP属性job-impressions-completedをオプションのとして指定します。つまり、印刷されたページをプリンタが知ることができない場合、プログラミングが正しいかどうかに関係なく、そのページを読み取ることはできません。

メーカーは通常、IPPをサポートすると主張していますが、実装しているかもしれない(またはしていない)オプション部品はあまりうまく文書化していません。

任意のプログラミングを行う前に、私はCUPSからipptool利用できるを使用して、利用可能なすべてのジョブattrbutesを読むことをお勧め:

#!/usr/bin/env ipptool -tv -d job=482 ipp://192.168.2.113/ipp 
{ 
OPERATION Get-Job-Attributes 
GROUP operation-attributes-tag 
ATTR charset attributes-charset utf-8 
ATTR language attributes-natural-language en 
ATTR uri printer-uri $uri 
ATTR integer job-id $job 
} 

job-stateは必須属性であり、いくつかの時間の後、最終的な状態に到達する必要がありますcompletedabortedcanceled

+0

ありがとう。あなたは 'job-impressions-completed'がオプションであると言うことについての参考文献を持っていますか? – Yuval

+0

[RFC 2911、セクション4.3](https://tools.ietf.org/html/rfc2911)ジョブの説明属性: "[属性]がREQUIREDと表示されていない場合、OPTIONAL" –

関連する問題