Problema com waitFor() + pdftohtml no Linux

Estou rodando meu jar pelo cron no linux e nele (JAR) chamo o pdftohtml do linux para efetuar “umas conversões”. :twisted:

//Considerem as declarações de SimpleDateFormat para 'formata' corretas 
String horaDeInicio = formata.format(new Date());  

String linhaDeComando= "pdftohtml -c -i @path1 @path2";
String pathDestino = diretorioRaiz+paraProcessar.getNome()+".pdf/html/"+paraProcessar.getNome();

linhaDeComando= linhaDeComando.replace("@path1", paraProcessar.getPathAbsoluto());
linhaDeComando= linhaDeComando.replace("@path2", pathDestino);

Runtime.getRuntime().exec(linhaDeComando).waitFor();

String horaFinal = ExecutaProcesso.formata.format(new Date());  

montaLog("\t" +paraProcessar.getNome()+".pdf  "+horaDeInicio +" ~ "+horaFinal +" \r\n");

Como podem ver coloco um waitFor().
Com isso espero gravar no meu Log a hora (HH:mm:ss) de início do processamento ‘pdftohtml’ e a hora (HH:mm:ss) do final do processamento.
O algoritmo está ok, porém o ‘waitFor()’ não faz o que promete com ‘pdftohtml’ no linux, no log marca apenas que o processamento levou 1 segundo ou as vezes nem isso! :shock:
Sendo que faço conversões para XML também. :roll:
O processo demora um pouco quando o arquivo é grande.

Peço a colaboração de vocês com este problema, pois o waitFor não aguarda o processamento ‘pdftohtml’ e com isso não tenho um log correto de processamento.
Desde já agradeço!

Só uma curiosidade, qual é o formato que está no seu DateFormat?

Já tinha visto seu tópico antes e, como não fazia idéia do que pudesse estar acontecendo, não respondi.

dateFormat = “dd.MM.yyyy”;
timeFormat = “HH:mm:ss”;

Já tenho outros problemas com o waitFor(), qua não funciona corretamente com Arquivos BAT.
ou seja, quero executar uma determinada linha de código(neste caso a hora final), SOMENTE depois que o aplicativo externo (neste caso o pdftohtml) terminar de executar.

Valeu por responder ViniGodoy. :slight_smile:

Eu também já tive problemas com o waitFor(). O seguinte link me ajudou a encontrar uma solução:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

       //verifica se retornou erros
        stream = new StreamHandler( process.getErrorStream() , "ERRO", area);
        //verifica se teve output
        streamOut = new StreamHandler( process.getInputStream() , "SAÍDA", area);
        Thread tStream = new Thread( stream );
        Thread tStreamOut = new Thread( streamOut );

        tStream.start();
        tStreamOut.start();

        try {
            int exitVal = process.waitFor();
            area.append( "Processo encerrou com status: " );
            area.append( exitVal + "\n" );
        } catch (InterruptedException ex) {}


        stream.stopHeader(true);
        streamOut.stopHeader(true);
public class StreamHandler implements Runnable {

    InputStream is;
    String type;
    JTextArea txtMsg;
    private boolean stopHandler;

    public StreamHandler( InputStream is, String type,  JTextArea txtMsg) {
        this.is = is;
        this.type = type;
        stopHandler = false;
        this.txtMsg = txtMsg;
    }

    public void run() {
        while( !stopHandler ) {
            try {
                InputStreamReader isr = new InputStreamReader(is);
                BufferedReader br = new BufferedReader(isr);
                String line = null;
                while ((line = br.readLine()) != null) {
                    System.out.println( type + ">>" + line + "\n" );
                    txtMsg.append(type + ">>" + line + "\n");
                }
            } catch (IOException ioe) {
                ioe.printStackTrace();
            }    
        }
    }

    public void stopHeader( boolean stop ) {
        this.stopHandler = stop;
    }
}

Eu já implementei algumas classes com esse mesmo propósito, mas um pouco mais flexíveis:

No tópico abaixo existe uma classe para redirecionar o stream do processo a outro stream, através de uma thread:

E aqui mostra como redirecionar o texto de um Stream para um JTextArea:

A vantagem é que com essas classes vc pode redirecionar para onde bem entender: arquivos, text area, um socket, etc.

[quote=sergiom]Eu também já tive problemas com o waitFor(). O seguinte link me ajudou a encontrar uma solução:

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4
[/quote]

Valeu pelo código sergiom! :smiley:
Vou analisar e testar… qualquer coisa posto aqui!

Mais um obrigado ao ViniGodoy…

vou até testar com meus BAT…hehehe…

É, ainda não refatorei esse código. Vou aproveitar e revisar ele. Mas postei pra exemplificar a idéia :slight_smile:

Pessoal, com os BAT funcionou legal… VALEU! :smiley:
fiz apenas uma adapatção simples mas o conceito é o mesmo, segue o código…

agora tenho que testar com o pdftohtml do Linux ( :evil: ) e ver se procede da mesma maneira.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JOptionPane;

public class TesteComBAT{
	public static String timeFormat = "HH:mm:ss"; 
	public static SimpleDateFormat formata;
	private static final String CAMINHO_PADRAO = "C:\\Arquiv~1\\XXX\\XXXXXX\\XXXXX\\"; // <- caminho do BAT
	
	public static void main(String[] args) {
		formata = new SimpleDateFormat(timeFormat);
		final String inicio = formata.format(new Date());
		try {
		      String line;
		      Process p = Runtime.getRuntime().exec(CAMINHO_PADRAO + "MEU_PROCESSO.bat");
		      BufferedReader input =new BufferedReader(new InputStreamReader(p.getInputStream()));
		      while ((line = input.readLine()) != null) {
		        System.out.println(line);
		      }
		      input.close();
			  JOptionPane.showMessageDialog(null, "Inicio -> " + inicio + " \n Fim -> " + formata.format(new Date()));
		} catch (IOException e) {
			e.printStackTrace();   
		} 
	}
}

Estou com um tópico aberto com outro problema se quiserem dar um olhada agradeço! Dados do Clipboard do Office para Componente Java <- vale a pena o desafio… :lol:

Pois então pessoal… o que funcionou com o windows não funcionou no Linux…

pdftohtml <- quem conhecer como funciona no linux agradeço, pois o waitFor() do java não espera… :frowning:

mas valeu a ajuda pessoal! :smiley: