2016-02-28 11 views
0

我寫了這個打印應用程序,它是在Windows 8.1 64位上從Python27啓動的。我的問題是它的公共位置上的一個Kiosk,當Python27啓動Java時,它有一個帶有關閉圖標的Windows命令提示符(某些用戶單擊命令提示符處的關閉圖標並且作業未完成)Java - 如何在沒有任何GUI或命令提示符彈出的情況下完全靜默地運行我的應用程序?

問題:無需在Kiosk中公開/彈出任何命令提示符,以靜默方式運行以下代碼?

import java.awt.print.PrinterException; 
import java.awt.print.PrinterJob; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.URL; 
import javax.print.DocPrintJob; 
import javax.print.PrintService; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.printing.PDFPageable; 

public class JPrint { 

    public static boolean saveFile(URL url, String file) throws IOException { 
    boolean download_status = false; 

    System.out.println("[OK] - 1"); 
    InputStream in = url.openStream(); 
    FileOutputStream fos = new FileOutputStream(new File(file)); 
    System.out.println("[OK] - 2"); 
    int length = -1; 
    byte[] buffer = new byte[1024]; 

    while ((length = in.read(buffer)) > -1) { 
     fos.write(buffer, 0, length); 
    } 
    fos.close(); 
    in.close(); 

    download_status = true; 
    System.out.println("[OK] - 3"); 
    return download_status; 
    } 

    public static void main(String[] args) throws IOException, PrinterException { 
    String downloaded_filename = "C:/pdf.pdf"; 
    String download_pdf_from = "http://www.example.com/index/print?kiosk=1"; 
    String downloaded_filename_open_as_pdf = "C:\\pdf.pdf"; 
    String printerNameDesired = "HP Photosmart 5520 series"; 

    // Get printers 
    PrintService[] services = PrinterJob.lookupPrintServices(); 
    DocPrintJob docPrintJob = null; 
      for (int i = 0; i < services.length; i++) { 
      System.out.println(services[i]); 
      } 

    try{ 
     URL url = new URL(download_pdf_from); 

     if(saveFile(url, downloaded_filename)) { 
     try { 
      PDDocument pdf = PDDocument.load(new File(downloaded_filename_open_as_pdf)); 
      PrinterJob job = PrinterJob.getPrinterJob(); 
      for (int i = 0; i < services.length; i++) { 
      if (services[i].getName().equalsIgnoreCase(printerNameDesired)) { 
      docPrintJob = services[i].createPrintJob(); 
      } 
      } 

      job.setPrintService(docPrintJob.getPrintService()); 
      job.setPageable(new PDFPageable(pdf)); 
      //docPrintJob = service[i].createPrintJob(); 
      job.print(); 

     } catch (Exception e) { 
      System.out.println("[FAIL]" + e); 
     }  
     } else { 
     System.out.println("[FAIL] - download fail"); 
     }  
    } catch (Exception ae) { 
     System.out.println("[FAIL]" + ae); 
    } 


    } 
} 

回答

3

更改您的Python代碼以使用「javaw」而不是「java」啓動Java應用程序。

請注意,這隻在Windows上需要。在其他平臺上,「java」命令不會啓動命令shell。

有關詳細信息,請參閱:


既然你是從Python中調用Java應用程序是這樣的:

Popen(['java', 
     '-cp', 
     'C:/Python27/pdfbox-app-2.0.0-RC3.jar;C:/Python27/jprint.jar', 
     'JPrint']) 

直進修複方法就是改變javajavaw;即

Popen(['javaw', 
     '-cp', 
     'C:/Python27/pdfbox-app-2.0.0-RC3.jar;C:/Python27/jprint.jar', 
     'JPrint']) 

@eryksun指出,就可以實現通過告訴Popen重寫應用程序的默認啓動的標誌同樣的目的;例如

DETACHED_PROCESS = 8 
Popen(['java', 
     '-cp', 
     'C:/Python27/pdfbox-app-2.0.0-RC3.jar;C:/Python27/jprint.jar', 
     'JPrint'], 
     creationflags=DETACHED_PROCESS) 
+0

我已經用'javaw.exe'和'C:\ Python27 \ mypy.pyw'運行了它。但我仍然有那個命令提示符彈出。 – YumYumYum

+0

這是如何從Python運行,我想我必須運行這個java到javaw。例如:'Popen(['java','-cp','C:/Python27/pdfbox-app-2.0.0-RC3.jar; C:/Python27/jprint.jar','JPrint'])' – YumYumYum

+1

是。你做。您目前正在使用「java.exe」,並且您需要使用「javaw.exe」。 –

相關問題