2013-04-17 31 views
1

我正在使用以下方法將PDF文檔打印到我的打印機。如果我只想打印一次,它工作正常,但打印多次需要更長的時間。將多個文檔賦予Java PrintService打印作業?

public static void print() 
{ 
    DocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE; 
    PrintService[] services = PrintServiceLookup.lookupPrintServices(flavor, null); 
    FileInputStream psStream = null; 
    try 
    { 
     psStream = new FileInputStream(System.getProperty("user.home")+"\\My Documents\\document.txt"); 
    } 
    catch (FileNotFoundException e) 
    { 
     System.out.println(e); 
    } 
    if (psStream == null) 
     return; 

    if (services.length > 0) 
    { 
     PrintService myService = null; 
     for (PrintService service : services) 
     { 
      System.out.println(service.getName()); 
      if (service.getName().contains("printer_name")) 
      { 
       myService = service; 
       break; 
      } 
     } 
     DocPrintJob printJob = myService.createPrintJob(); 
     Doc document = new SimpleDoc(psStream, flavor, null); 

     try 
     { 
      printJob.print(document, null); 
     } catch (PrintException e) 
     { 
      System.out.println(e); 
     } 
    } else 
    { 
     System.out.println("No PDF printer available."); 
    } 
} 

所以,如果我想打印文檔五次,我把print()在一個循環,然後還有文檔的每個印刷之間的一個相當長的延遲。這種情況對我來說很有意義,因爲必須爲每個文檔重新建立與打印機的連接,並且必須重新發送文檔。有沒有什麼辦法可以使用這個API多次給打印作業提供相同的文檔?

我想這是值得注意的,我試過把printJob.print(document,null)命令放在一個產生PrintException: already printing的循環中。也許如果有辦法讓它在發送下一個文件之前等待當前文件完成,它可以工作?在這裏輸了。謝謝。

@mthmulders:我試了下面,只打印了一份。我做錯了什麼?

Doc document = new SimpleDoc(psStream, flavor, null); 
    PrintRequestAttributeSet set = new HashPrintRequestAttributeSet(); 
    set.add(new Copies(5)); 

    try 
    { 
     printJob.print(document, set); 
    } catch (PrintException e) 
    { 
     System.out.println(e); 
    } 

回答

0

如果你想打印文檔的五倍,我想你必須創建一個PrintRequestAttributeSet,把一個Copies屬性在與你想擁有的份數。

將此PrintRequestAttributeSet作爲printJob.print(...)調用的第二個屬性,應該沒問題。

我現在不能嘗試,但跟着Javadoc這似乎是做到這一點的方法。

+0

請參閱對原始問題的編輯。 – ericjv

+0

Javadoc說:「在許多設備上,支持的分類副本數量將受到設備上物理輸出分檔數量的限制,並且可能與可支持的未分卷副本數量不同。」不知道爲什麼,但也許這是解釋? – mthmulders

0

也許是否有辦法讓它等到當前文件完成後再發送下一個文件才能工作?

我不知道這是否會是最好的方式,但如果沒有別的辦法,你可以嘗試添加一個printJobListener:

printJob.addPrintJobListener(new MyPrintJobListener()); 

與類MyPrintJobListenenr之中:

public class MyPrintJobListener implements PrintJobListener{ 
    public void printDataTransferCompleted(PrintJobEvent pje) { 
     System.out.println("printDataTransferCompleted"); 
    } 

    public void printJobCanceled(PrintJobEvent pje) { 
     System.out.println("The print job was cancelled"); 
    } 

    public void printJobCompleted(PrintJobEvent pje) { 
     System.out.println("The print job was completed"); 
    } 

    public void printJobFailed(PrintJobEvent pje) { 
     System.out.println("The print job has failed"); 
    } 

    public void printJobNoMoreEvents(PrintJobEvent pje) { 
     System.out.println("No more events"); 
    } 

    public void printJobRequiresAttention(PrintJobEvent pje) { 
     System.out.println("The print job require attention"); 
    } 
}