wkhtmltopdf进程在Java中挂起

时间:2012-07-11 14:23:29

标签: java process pdf-generation bufferedreader wkhtmltopdf

我正在从Java运行wkhtmltopdf。我创建了一个进程,但是这个进程似乎是挂起的,因为它一次又一次地重复控制台,也在任务管理器中。

这就是我运行wkhtmltopdf的方式:

String command = applicationLocation + "wkhtmltopdf.exe -O Landscape " + reqURL + "?" + reqQuery + " c:/PDF/" + folderName + "/" + id + "/" + folderName + ".pdf";
Process p = Runtime.getRuntime().exec(command);

在工作完成后,我怎样才能“破坏”这个过程?

这对我不起作用,过程从未停止过,代码也从未进入while循环:

ProcessBuilder pb = new ProcessBuilder(application, htmlFilePath, pdfFilePath);
Process process = pb.start();

BufferedReader errStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
System.out.println("read errstreamreader");
//not "process.getInputStream()" 

String line = null;

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

    if(line.equals("Done")) {
        process.destroy();
        System.out.println("destroyed process");
    }
} 

2 个答案:

答案 0 :(得分:0)

这是一个非常难看的问题。我的代码引起了循环。我调用了这个类,它使用以下代码从servlet生成PDF:

// create pdf
if(action != null && action.equals("pdf")) {
    String reqURL = request.getRequestURL().toString();
    String reqQuery = "id=" + bomModuleId+ "&action=pdf";
    String folderName = "doonot";
    GeneratePDF obj = new GeneratePDF();
    obj.genrateCmd(reqURL, "xxx", "xxx", reqQuery, folderName, "10.07.2012");  
}

事实证明,wkhtmltopdf使用了相同的URL,因此它向该页面发出请求,在此循环中登陆,并再次调用wkhtmltopdf。所以我最终得到了450个wkhtmltopdf进程,一切都崩溃了。

解决方案:我删除了"&action=pdf"

答案 1 :(得分:0)

事实证明我也有同样的问题:循环wkhtmltopdf创建了一堆进程导致运行Windows 7的我的机器急剧减速。

问题不在于wkhtmltopdf和Runtime exec一样。它创建了更多的wkhtmltopdf进程,无需等待任何前一个进程完成,直到缺少系统资源冻结您的计算机。

我的解决方案:添加p.waitFor()。它将等待wkhtmltopdf进程完成,然后继续循环。

此解决方案仍然可能很慢,因为现在大型html文件可能会减慢循环的完成速度。因此,如果您想要更快的解决方案,我建议您使用wkhtmltopdf中的--read-from-stdin选项。

至于阅读wkhtmltopdf的输出,我建议查看this question and ALL of its answers.