Question

Est-il possible en Java d'imprimer sur une imprimante spécifique IPP? Tous les exemples de code et des tutoriels que j'ai trouvé l'accent sur la façon d'imprimer un type particulier de document, en utilisant quelque chose comme ce qui suit:

DocFlavor flavor = DocFlavor.INPUT_STREAM.POSTSCRIPT;
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
PrintService[] pservices =
             PrintServiceLookup.lookupPrintServices(flavor, aset);
if (pservices.length > 0) {
    DocPrintJob pj = pservices[0].createPrintJob();
    try {
        FileInputStream fis = new FileInputStream("test.ps");
        Doc doc = new SimpleDoc(fis, flavor, null);
        pj.print(doc, aset);
    } catch (FileNotFoundException fe) {
    } catch (PrintException e) { 
    }
}

Cet extrait imprime simplement la première imprimante trouvée qui est capable d'imprimer le document. Dans mon cas, je veux rechercher une imprimante par son URI, mais PrintServiceLookup ne semble pas soutenir. Je l'ai essayé d'utiliser un PrintServiceAttributeSet, au lieu de PrintRequestAttributeSet, et en ajoutant un attribut PrinterURI, mais qui ne renvoie aucune imprimante. Je soupçonne que le service de recherche est à la recherche d'une imprimante qui peut changer son URI de destination, plutôt que de chercher l'imprimante avec cette URI.

En dernier recours, je pensais à tout énumérer par tous les PrintServices retournés par lookupPrintServices, mais l'URI est pas dans l'un des attributs. Le nom de l'imprimante est là, mais je dois l'URI.

Pour le fond, mon webapp a besoin d'imprimer un code-barres à une imprimante spécifique, en fonction de l'utilisateur actuel. Chaque utilisateur est associé à une URI imprimante, qui pointe vers une imprimante sur un serveur CUPS. L'URI de l'imprimante est la seule information dont je dispose, et je ne peux pas contraindre le nom de l'imprimante pour correspondre à l'URI ou une sous-chaîne de l'URI.

Modifier Pour clarifier un peu, je ne ai pas besoin de rendre les données, j'ai juste besoin de copier un blob à une imprimante donnée. La partie que je ne peux pas comprendre comment identifier une imprimante par son URI IPP.

Était-ce utile?

La solution

J'ai finalement trouvé un moyen de le faire, en utilisant jipsi:

URI printerURI = new URI("ipp://SERVER:631/printers/PRINTER_NAME");
IppPrintService svc = new IppPrintService(printerURI);
InputStream stream = new BufferedInputStream(new FileInputStream("image.epl"));
DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
Doc myDoc = new SimpleDoc(stream, flavor, null);
DocPrintJob job = svc.createPrintJob();
job.print(myDoc, null);

Je dois admettre que je suis déçu d'avoir à utiliser une bibliothèque 3ème partie à faire quelque chose en apparence si simple que l'impression sur une imprimante spécifique.

UPDATE

DR indique dans les commentaires que jipsi a une nouvelle , et un nouveau nom.

Cups4J est une alternative agréable, mais comme son nom l'indique, il ne fonctionne pas correctement si la destination est pas un serveur CUPS. J'ai eu de bons résultats à l'aide Cups4J pour imprimer directement sur une imprimante thermique Zebra.

Autres conseils

Je ne pense pas que vous pouvez obtenir une imprimante comme vous le souhaitez (je pense que le mécanisme d'impression IPP Java est antérieure).

Vous pouvez, cependant, si je me souviens bien être en mesure de rendre votre travail d'impression localement, puis expédier les octets du flux de sortie vers le serveur cible CUPS « à la main ». Serait-ce « assez bon » pour vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top