簡體   English   中英

Java-如何在沒有任何GUI或命令提示符彈出窗口的情況下完全安靜地運行我的應用程序?

[英]Java - how to run my application completely silently without any GUI or Command prompt popup?

我編寫了此打印應用程序,該應用程序是從Windows 8.1 64位上的Python27啟動的。 我的問題是它在公共位置的信息亭,當Python27啟動Java時,它有一個帶有關閉圖標的Windows命令提示符(某些用戶在命令提示符處單擊關閉圖標,但作業未完成)

問題:如何在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);
    }


  }
}

更改您的Python代碼以使用“ javaw”而不是“ java”啟動Java應用程序。

請注意,這僅在Windows上是必需的。 在其他平台上,“ java”命令不會啟動命令外殼程序。

有關更多詳細信息,請參閱:


假設您正在像這樣從Python調用Java應用程序:

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

直接的解決方法是將java更改為javaw

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM