8
votes

Lancement de WKHTMLTOPDF à partir de Runtime.GetRuntime (). EXEC (): Ne vous terminera jamais?

Je lance WKHTMLTOPDF à partir de mon application Java (partie d'un serveur Tomcat, en mode de débogage dans Eclipse Helios sur Win7 64 bits): J'aimerais attendre qu'il soit terminé, puis faire plus de choses. xxx pré>

mais waitfor () code> ne revient jamais. Je peux toujours voir le processus dans le gestionnaire de tâches Windows (avec la ligne de commande que j'ai passée à EXEC (): a l'air bien). ET IL FONCTIONNE. WKHTMLTOPDF produit le PDF que j'attendais, juste où je m'y attendais. Je peux l'ouvrir, le renommer, quoi que ce soit, même si le processus est toujours en cours d'exécution (avant de le résilier manuellement). P>

de la ligne de commande, tout va bien: P>

c:\wrk>wkhtmltopdf C:\Temp\foo.html c:\wrk\foo.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done


1 commentaires

Merci pour les réponses rapides. Cela résout le cas général assez joliment, mais il y a des trucs spécifiques WKHTMLTOPDF persistants. Je vais mettre à jour la question.


4 Réponses :


2
votes

1 commentaires

En option supplémentaire, vous pouvez attraper les flux et simplement les fermer. Ce n'est pas la meilleure idée du monde et et je m'en soucie, mais cela fonctionne dans une pincée.



4
votes

Un processus comporte 3 flux: entrée, sortie et erreur. Vous pouvez lire à la fois des sorties et des erreurs en même temps en utilisant des processus distincts. Voir Cette question et sa question acceptée répondez et aussi celui-ci par exemple.


0 commentaires

11
votes

J'ai eu le même problème exact que vous et je l'ai résolu. Voici mes découvertes:

Pour une raison quelconque, la sortie de WKHTMLTOPDF va à Sterr du processus et non stdout. Je l'ai vérifié en appelant WKHTMLTOPDF de Java ainsi que Perl P>

Donc, par exemple en Java, vous devriez faire: P>

ProcessBuilder pb = new ProcessBuilder("wkhtmltopdf.exe", htmlFilePath, pdfFilePath); 
pb.redirectErrorStream(true); 
Process process = pb.start(); 
BufferedReader inStreamReader = new BufferedReader(new  InputStreamReader(process.getInputStream())); 


1 commentaires

Très utile. Merci beaucoup pour avoir posté la solution.



2
votes
    final Semaphore semaphore = new Semaphore(numOfThreads);
    final String whktmlExe = tmpwhktmlExePath;
    int doccount = 0;
    try{
        File fileObject = new File(inputDir);
        for(final File f : fileObject.listFiles()) {

            if(f.getAbsolutePath().endsWith(".html")) {
                doccount ++;
                if(doccount >500 ) {
                    LOG.info(" done with conversion of 1000 docs exiting ");
                    break;
                }
                System.out.println(" inside for before "+semaphore.availablePermits());
                semaphore.acquire();
                System.out.println(" inside for after "+semaphore.availablePermits() + " ---" +f.getName());
                new java.lang.Thread() {
                    public void run() {
                        try {
                            String F_ =  f.getName().replaceAll(".html", ".pdf") ;
                            ProcessBuilder pb = new ProcessBuilder(whktmlExe , f.getAbsolutePath(), outPutDir + F_ .replaceAll(" ", "_") );//"wkhtmltopdf.exe", htmlFilePath, pdfFilePath);
                            pb.redirectErrorStream(true);
                            Process process = pb.start();
                            BufferedReader errStreamReader = new BufferedReader(new  InputStreamReader(process.getInputStream()));  
                            String line = errStreamReader.readLine(); 
                            while(line != null) 
                            { 
                                System.err.println(line); //or whatever else
                                line = errStreamReader.readLine(); 
                            }

                            System.out.println("after completion for ");
                        } catch (Exception e) {
                            e.printStackTrace();
                        }finally {
                            System.out.println(" in finally releasing ");
                        semaphore.release();
                        }
                  }
                }.start();
            }
        }
    }catch (Exception ex) {
        LOG.error(" *** Error in pdf generation *** ", ex);
    }

    while (semaphore.availablePermits() < numOfThreads) {//till all threads finish 
        LOG.info( " Waiting for all threads to exit "+ semaphore.availablePermits() + " --- " +( numOfThreads - semaphore.availablePermits()));
        java.lang.Thread.sleep(10000);
    }

0 commentaires