Impression via des tasses à l'aide de javax.imprimer


J'ai un fichier qui fonctionne très bien si j'utilise la commande lp filename.

Le fichier est un fichier ESC/P pour une imprimante à impact de reçu. Cela a des pilotes CUPS natifs linux et tout ce qui fonctionne.

J'essaie d'utiliser l'API javax.print afin que je puisse avoir un contrôle plus fin sur l'impression et, espérons-le, le garder compatible multiplateforme, bien que Linux soit la plate-forme cible.

J'ai essayé toutes les combinaisons DocFlavor connues de l'homme et tous les types de types de données (InputStream, byte[], Reader etc.)

Il ignore simplement la commande print() tous ensemble ou retourne simplement une feuille de papier vierge. L'exécution de lp filename imprime parfait, alors comment puis-je obtenir javax.print pour faire l'équivalent fonctionnel de lp filename?

Je ne suis pas prêt à utiliser javax.print Je peux utiliser d'autres "choses" et pourrait commencer à enquêter sur cups4J mais il semble que cela me limiterait à Linux/*nix uniquement, ce qui est OK pour l'instant mais préférerait avoir une solution multiplateforme.

Je pourrais simplement émettre le lp système commande sur le fichier mais, j'ai besoin d'un contrôle plus fin. Ce ne sont pas des reçus que nous imprimons, ce sont des billets et les billets vont de 5,00 $à des milliers de dollars. Actuellement, si nous détectons un problème d'impression, nous annulons la transaction et si quelque chose imprimé, c'est invalide, nous ne prenons pas les réimpressions à la légère et la plupart du temps, nous facturons pour imprimer une nouvelle copie si le client perd sa copie. Oh la raison pour cela est que nous changeons le système de point de vente de Windows à Linux et les imprimantes de direct accès via les ports série aux CUPS gérés via USB. Voici mon code qui ne fonctionne pas. Toute aide est appréciée.

try {
    // Find the default service
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;

    PrintService service = PrintServiceLookup.lookupDefaultPrintService();

    // Create the print job
    DocPrintJob job = service.createPrintJob();
    InputStream in = new FileInputStream("/home/bart/real.escp");
    Doc docNew = new SimpleDoc(in,flavor,null);

    // Monitor print job events; for the implementation of PrintJobWatcher,
    // see Determining When a Print Job Has Finished
    PrintJobWatcher pjDone = new PrintJobWatcher(job);

    // Print it
    job.print(docNew, null);

    // Wait for the print job to be done
    pjDone.waitForDone();

    // It is now safe to close the input stream
    in.close();
} catch (PrintException e) {
} catch (IOException e) {
}
Author: Andrew Lygin, 2011-08-24

1 answers

Je vais bien avec cups4j. De la première à obtenir de votre imprimante.

try { 
        CupsClient client = new CupsClient("addressOfTheCupsServer", 631);
        List<CupsPrinter> printers = client.getPrinters();
        if (printers.size() == 0) {
            throw new RuntimeException("Cant list Printer");
        }
        for (CupsPrinter cupsPrinter : printers) {
            if (cupsPrinter.getName().equals("NameOfPrinter")) {
                selectedPrinter = cupsPrinter;
            }
        }
    }catch (Exception ignored){
        ignored.printStackTrace();
    }
}

Puis créez un travail d'impression et envoyez-le à l'imprimante

 PrintJob printJob = new PrintJob.Builder(inputStream).jobName("Jobname").build();
    PrintRequestResult result = selectedPrinter.print(printJob);
 0
Author: Falk Jäger, 2016-12-04 01:16:19