2016-09-22 181 views
1

我有一个java程序,它可以将原始数据打印到热敏打印机。该代码在服务器中完美工作,但在客户端访问时,它会在服务器的打印机本身而不是客户端的默认打印机上进行打印。 以下是我用来打印的代码。请帮我看看代码。打印机打印服务器而不是客户端

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 

import javax.print.Doc; 
import javax.print.DocFlavor; 
import javax.print.DocPrintJob; 
import javax.print.PrintException; 
import javax.print.PrintService; 
import javax.print.PrintServiceLookup; 
import javax.print.SimpleDoc; 

import javax.print.attribute.HashPrintRequestAttributeSet; 
import javax.print.attribute.PrintRequestAttributeSet; 
import javax.print.attribute.standard.Copies; 

import javax.print.event.PrintJobAdapter; 
import javax.print.event.PrintJobEvent; 

public class PrintText { 

    public static void main(String[] args) throws PrintException, IOException { 

     String defaultPrinter = PrintServiceLookup.lookupDefaultPrintService().getName(); 
     System.out.println("Default printer: " + defaultPrinter); 
     PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

     // prints the famous hello world! plus a form feed 
     InputStream is = new ByteArrayInputStream("\nMadha Enterprice\n".getBytes(UTF8)); 

     PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
     pras.add(new Copies(1)); 

     DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
     Doc doc = new SimpleDoc(is, flavor, null); 
     DocPrintJob job = service.createPrintJob(); 

     PrintJobWatcher pjw = new PrintJobWatcher(job); 
     job.print(doc, pras); 
     pjw.waitForDone(); 
     is.close(); 
    } 
} 

class PrintJobWatcher { 
    boolean done = false; 

    PrintJobWatcher(DocPrintJob job) { 
     job.addPrintJobListener(new PrintJobAdapter() { 
      public void printJobCanceled(PrintJobEvent pje) { 
       allDone(); 
      } 

      public void printJobCompleted(PrintJobEvent pje) { 
       allDone(); 
      } 

      public void printJobFailed(PrintJobEvent pje) { 
       allDone(); 
      } 

      public void printJobNoMoreEvents(PrintJobEvent pje) { 
       allDone(); 
      } 

      void allDone() { 
       synchronized (PrintJobWatcher.this) { 
        done = true; 
        System.out.println("Printing done ..."); 
        PrintJobWatcher.this.notify(); 
       } 
      } 
     }); 
    } 

    public synchronized void waitForDone() { 
     try { 
      while (!done) { 
       wait(); 
      } 
     } catch (InterruptedException e) { 
     } 
    } 
} 
+2

你是什么意思服务器?我在这里没有看到任何客户机/服务器体系结构...此代码是否在服务器上运行,并且是Web应用程序的一部分,还是正在运行您在'客户机'上发布的确切代码? – Plirkee

+0

这不是确切的程序,而是我使用的确切逻辑。我使用泽西休息api与相同的逻辑打印到客户机。服务器是Tomcat7。 –

+1

如果此代码在服务器端执行 - 它将在服务器端打印。它是如此简单。你没有清楚地说明这个代码是如何被调用的......所以不清楚执行的地方。但是从你的问题描述中,我会推断它在服务器端执行... – Plirkee

回答

1

用下面的代码:

PrintService service = PrintServiceLookup.lookupDefaultPrintService(); 

您选择此代码运行的机器上的默认打印机 - 如果在服务器上运行,则预计将打印服务器的默认打印机。

相关问题