So erhalten Sie eine Benachrichtigung vom Drucker, wenn die physische Seite / der Auftrag abgeschlossen ist

Ich möchte eine Benachrichtigung von einem Netzwerkdrucker erhalten, wenn der Druck einer Seite (und / oder des gesamten Auftrags) physisch abgeschlossen ist. Dies wird in einer App verwendet, die ich für die Druckverwaltung über das Web schreibe. Da die Benutzer pro Seite abgerechnet werden und die Abrechnung nicht sinken sollte, bevor die Seite tatsächlich vollständig ist.

Ich bin mir nicht sicher, ob dazu ein Treiber, ein Plug-in oder eine Client-App erforderlich ist. Ich bin flexibel mit meiner Plattform, da mein Client noch nicht geschrieben ist. Daher würde ich gerne eine geeignete Lösung für Windows oder Linux in einer beliebigen Programmiersprache / -stufe finden.

Mir ist bewusst, dass es einen Unterschied zwischen dem Spooler und dem Drucker gibt. Ich versuche zu untersuchen, auf welcher Ebene der Drucker das Gerät möglicherweise über IPP benachrichtigt, wenn die Seite oder der Auftrag physisch abgeschlossen ist.

Ich bin derzeit in Java suchen, mit entwederjspi odercups4j Paket, um eine Benachrichtigung zu erhalten, wenn die IPP-Eigenschaftjob-impressions-completed wechselt oder fragt alternativ danach ab. Ich verwende eine CUPS-IPP-Schnittstelle zu einem lokalen Drucker. Ausführen eines einfachen Testers (HelloPrint.java im Anhang; oder derCupsTest.java enthalten in cups4j) habe ich keine erhaltenjob-impressions-completed Attributänderungen und das Attribut für den Job wurden beim Abrufen nicht aufgelistet.

Also hier sind die Fragen:

Mache ich das richtig? Wenn nicht, wie soll ich das machen?Da dies eine CUPS-Schnittstelle zu einem lokalen Drucker ist, kann es sein, dass diejob-impressions-completed Das Attribut wird nicht aktualisiert, da es als Spooler für den realen Drucker fungiert. Vorausgesetzt, der echte Druckerwerden Benachrichtigen oder Auflisten dieses Attributs. Wäre dies druckerspezifisch oderMuss Hat ein IPP-unterstützender Drucker dieses Attribut verfügbar und aktualisiert?

Systeminfo: Ubuntu 11.10, CUPS 1.5.0, Drucker ist Brother HL-2240D (PPD hier erhältlich)

Hinweis: HL-2240D istnicht den Drucker, den ich für das spätere Projekt verwenden werde (insbesondere IPP wird nicht unterstützt); Ich beabsichtige, entweder einen HP HL4250DN oder Samsung 3741ND oder ähnliches zu verwenden.

Hier ist eine Beispiel-App mit demjavax.print Pakete und JSPI:

HelloPrint.java

<code>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()));
            }
        }
    }

}
</code>

Antworten auf die Frage(1)

Ihre Antwort auf die Frage