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. mais de la ligne de commande, tout va bien: P> 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>
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
4 Réponses :
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.
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. P>
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()));
Très utile. Merci beaucoup pour avoir posté la solution.
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); }
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.