¿Cómo obtener java getRuntime (). Exec () para ejecutar un programa de línea de comandos con argumentos?

He estado tratando de escribir un programa java que usa elRuntime.getRuntime().exec() Método para usar la línea de comandos para ejecutar una instancia del programa "tesseract".

Algunos antecedentes, Tesseract es un programa gratuito de código abierto que se utiliza para realizar OCR (Reconocimiento óptico de caracteres) en las imágenes. Toma un archivo de imagen y genera un documento de texto. Es un programa de línea de comandos que usa este comando para ejecutarse.

(desde dentro de la consola del símbolo del sistema)

tesseract imageFilePath outFilePath [optional arguments] 

ejemplo:

tesseract "C:\Program Files (x86)\Tesseract-OCR\doc\eurotext.tif" "C:\Users\Dreadnought\Documents\TestingFolder\out"

el primer argumento llama al programa tesseract, el segundo es la ruta absoluta al archivo de imagen y el último argumento es la ruta y el nombre de lo que debe ser el archivo de salida. Tesseract solo requiere el nombre del archivo de salida, no requiere la extensión.

Trabajando desde la línea de comandos esto funciona perfecto. Sin embargo, tenía ganas de ejecutar esto desde un programa java y estaba teniendo algunos errores.

Encontré este código muy útil como punto de partida.

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String cmdString = "cmd /c dir";

         System.out.println(cmdString);
         Process pr = rt.exec(cmdString);

         BufferedReader input = new BufferedReader(new InputStreamReader(
                                                   pr.getInputStream()));

         String line = null;

         while ((line = input.readLine()) != null)
         {
            System.out.println(line);
         }

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);

      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

Imprime el resultado del comando dir. Sin embargo cuando lo modifiqué así

public class Main
{
   public static void main(String args[])
   {
      try
      {
         Runtime rt = Runtime.getRuntime();
         String imageFilePath = "\"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\"";
         String outputFilePath = "\"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"";
         String[] commands = {"cmd", "/c", "tesseract", imageFilePath, outputFilePath };

         Process pr = rt.exec(commands);

         BufferedReader input = new BufferedReader(new InputStreamReader(
               pr.getInputStream()));

         String line = null;

         while ((line = input.readLine()) != null)
         {
            System.out.println(line);
         }

         int exitVal = pr.waitFor();
         System.out.println("Exited with error code " + exitVal);
      }
      catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }
   }
}

Lo único que produce esExited with error code 1. Este es el resultado esperado si el proceso finalizó con un error.

Incluso he intentado pasar"cmd /c tesseract \"C:\\Program Files (x86)\\Tesseract-OCR\\doc\\eurotext.tif\" \"C:\\Users\\Dreadnought\\Documents\\TestingFolder\\eurotext-example\"" Y terminé teniendo el mismo error.

De acuerdo aUsando comillas dentro de getRuntime (). Exec Pensé que el problema era que había intentado escapar de las comillas, por eso pasé en una matriz String. Pero todavía estoy recibiendo laExited with error code 1.

¿Es posible ejecutar un programa de línea de comandos con el java?Runtime.getRuntime().exec() ¿mando?

EDITAR: El problema sigue ocurriendo

He intentado no usar "cmd / c" pensando en la misma línea de razonamiento que Evgeniy Dorofeev y Nandkumar Tekale sugirieron a continuación. Sin embargo, me sale un tipo diferente de error:

java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system cannot find the file specified
java.io.IOException: Cannot run program "tesseract": CreateProcess error=2, The system  cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at Main.main(Main.java:15)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
... 4 more

Tal vez esto le da más información? Estoy realmente curioso acerca de lo que está causando este problema. También el problema es el mismo si agrego o no las citas escapadas a mis argumentos.

Editar 2: En un capricho, proporcioné una ruta absoluta al ejecutable tesseract y no usé elcmd /c trabajado como un encanto. Supongo que la pregunta es siRuntime.getRuntime().exec() No llames variables de entorno?

Respuestas a la pregunta(4)

Su respuesta a la pregunta