2009-10-31 3 views
13

Existe-t-il un moyen Java d'imprimer sur une imprimante IPP spécifique? 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:Impression vers une imprimante spécifique (IPP URI) en Java

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 la document. Dans mon cas, je veux rechercher une imprimante par son URI, mais PrintServiceLookup ne semble pas supporter cela. J'ai essayé d'utiliser un PrintServiceAttributeSet, au lieu de PrintRequestAttributeSet, et en ajoutant un attribut PrinterURI, mais cela ne renvoie aucune imprimante. Je suspecte que le service de recherche recherche une imprimante qui peut changer son URI de destination, plutôt que recherchant l'imprimante avec cet URI. En dernier recours, je pensais à l'énumération de tous les PrintService retournés par lookupPrintServices, mais l'URI ne figure dans aucun des attributs. Le nom de l'imprimante est là, mais j'ai besoin de l'URI. Pour l'arrière-plan, ma webapp doit imprimer un code à barres sur une imprimante spécifique, en fonction de l'utilisateur actuel. Chaque utilisateur est associé à une URI d'imprimante qui pointe vers une imprimante sur un serveur CUPS. L'URI de l'imprimante est la seule information que j'ai et je ne peux pas contraindre le nom de l'imprimante à correspondre à l'URI ou à une sous-chaîne de l'URI.

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

Répondre

11

J'ai finalement trouvé une façon 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 de si simple en apparence que l'impression à une imprimante spécifique.

MISE À JOUR

DR souligne dans le comments que jipsi a une nouvelle home, et un nouveau nom.

Cups4J est une bonne alternative, mais comme son nom l'indique, il peut ne pas fonctionner correctement si la destination n'est pas un serveur CUPS. J'ai eu de bons résultats en utilisant Cups4J pour imprimer directement sur une imprimante thermique Zebra.

+0

Le lien semble être mort, mais il semble que le code d'origine soit disponible sur code.google.com, bien que sous un nom différent (jspi): http://code.google.com/p/jspi/ (Only svn caisse, pas de téléchargements) –

+0

@DR Merci pour le lien, j'ai mis à jour la réponse avec les informations. –

+0

Comment avez-vous trouvé le PRINTER_NAME à virer à la fin de l'URL? – rancidfishbreath

0

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

Vous pouvez cependant, si je me souviens bien être capable de rendre votre travail d'impression localement et ensuite expédier les octets du flux de sortie sur le serveur CUPS cible "à la main". Serait-ce "assez bon" pour vous?

+0

En réalité, le travail d'impression a déjà été rendu par un processus externe dans EPL, qui est natif de l'imprimante (similaire à PostScript ou PCL). Donc oui, si je peux expédier les octets au serveur CUPS ce serait assez bon. Je voudrais éviter d'implémenter un client IPP à la main si possible. –

Questions connexes