2015-08-04 1 views
0

Je souhaite imprimer un fichier PDF au Zebra printer en utilisant une application Java. J'ai généré un PDF en utilisant Jasper reports avec des codes à barres 2D. Si j'effectue une impression manuelle sur l'imprimante Zebra, j'imprime ce fichier PDF mais une fois que j'essaie d'imprimer le même fichier pdf à l'aide de l'application Java, le travail est envoyé à l'imprimante mais l'impression n'est pas possible.Comment imprimer des données de tableaux d'octets sur une imprimante Zebra?

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import javax.print.Doc; 
import javax.print.DocFlavor; 
import javax.print.DocPrintJob; 
import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 
import javax.print.SimpleDoc; 
import javax.print.event.PrintJobAdapter; 
import javax.print.event.PrintJobEvent; 

public class ZebraPrintUtil { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     byte[] content = convertFileToBytes("D://old files/test123.pdf"); 
     print(content, "ZDesigner GX420t"); 
    } 

    private static byte[] convertFileToBytes(String absoluteFilePath) throws IOException { 
     File file = new File(absoluteFilePath); 
     FileInputStream fis = new FileInputStream(file); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     byte[] buf = new byte[1024]; 

     try { 
      for (int readNum; 
      (readNum = fis.read(buf)) != -1;) { 
       bos.write(buf, 0, readNum); // no doubt here is 0 
      } 
     } catch (IOException ex) { 

     } finally { 
      if (fis != null) { 
       fis.close(); 
      } 
     } 

     byte[] bytes = bos.toByteArray(); 
     return bytes; 
    } 

    private static boolean print(byte[] byteArray, String reqPrinterId) 
      throws IOException, InterruptedException { 
     boolean isPrintedSuccessfully = false; 
     DocFlavor flavor = DocFlavor.BYTE_ARRAY.AUTOSENSE; 
     PrintService[] services = PrintServiceLookup.lookupPrintServices(
     flavor, null); 

     if (services.length > 0) { 
      PrintService myService = null; 

      for (PrintService service: services) { 
       if (service.getName().contains(reqPrinterId)) { 
        myService = service; 
        break; 
       } 
      } 

      DocPrintJob printJob = myService.createPrintJob(); 
      JobCompleteMonitor monitor = new JobCompleteMonitor(); 
      printJob.addPrintJobListener(monitor); 
      Doc document = new SimpleDoc(byteArray, flavor, null); 

      try { 
       printJob.print(document, null); 
       monitor.waitForJobCompletion(); 
       System.out.println("-------------------- Print Completed " + monitor.completed); 

       isPrintedSuccessfully = true; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 

     return isPrintedSuccessfully; 
    } 

    private static class JobCompleteMonitor extends PrintJobAdapter { 
     private boolean completed = false; 

     @Override 
     public void printJobCanceled(PrintJobEvent pje) { 
      signalCompletion(); 
     } 

     @Override 
     public void printJobCompleted(PrintJobEvent pje) { 
      signalCompletion(); 
     } 

     @Override 
     public void printJobFailed(PrintJobEvent pje) { 
      signalCompletion(); 
     } 

     @Override 
     public void printJobNoMoreEvents(PrintJobEvent pje) { 
      signalCompletion(); 
     } 

     private void signalCompletion() { 
      synchronized(JobCompleteMonitor.this) { 
       completed = true; 
       JobCompleteMonitor.this.notify(); 
      } 
     } 

     public synchronized void waitForJobCompletion() { 
      try { 
       while (!completed) { 
        wait(); 
       } 
      } catch (InterruptedException e) { 

      } 
     } 
    } 
} 
+0

montrer ur le code src compagnon – nafas

+0

Comment avez-vous effectué une impression manuelle - 'copier/b x, pdf prn:'? Normalement on laisse à Adobe pour imprimer le pdf. –

+0

Impression manuelle signifie ouvrir ce fichier pdf et cliquez sur le bouton d'impression sélectionnez l'imprimante zèbre. –

Répondre

0

Pour Desktop intégration:

File file = ... 
if (Desktop.isDesktopAvailable()) { 
    Desktop.getDesktop().print(file); 
} 
+0

Après avoir lu ce fichier pdf, je veux effectuer une impression silencieuse. Premièrement, je vais vérifier si l'imprimante est attachée ou non à cette machine où mon programme Java est en cours d'exécution, puis je vais envoyer ce document à cette imprimante. –