我试图从网页生成pdf,通过Centos OS上的java ProcessBuilder调用wkhtmltopdf。问题是,当我用一个main方法运行一个简单类时,进程终止于:
Command has terminated with status: 139
Output:
Error: Loading pages (1/6) ....
并创建一个空pdf文件(大小为0B)
我包含了一个方法,该方法打印我在类中调用wkhtmltopdf的参数,当我复制命令并在bash中运行它时,它工作并创建pdf。更重要的是:当我在windows中运行完全相同的类时,它运行得很好。什么会导致此错误代码139?这可能是wkhtmltopdf中的错误,还是我做错了什么?
以下是更多信息:
操作系统:
[root@host sandbox]# uname -a
Linux xxxxxx.com 2.6.32-279.22.1.el6.x86_64 #1 SMP Wed Feb 6 03:10:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
[root@host bin]# ./wkhtmltopdf --version
Name:
wkhtmltopdf 0.12.0 03c001de254b857f08eba80b62d4b6490ffed41d
我尝试使用process builder运行的命令:
/root/wk/wkhtmltox/bin/wkhtmltopdf --window-status export-ready
--encoding UTF-8
--custom-header username username
--custom-header password pass
--run-script "<some correctly escaped js>"
http://xx.xx.xx.xx/url?param1=1¶m2=2
/root/sandbox/test.pdf
pdf生成代码:
public String exportToPdf(final String bookmarkableUrl) {
String uuid = UUID.randomUUID().toString();
final String fullUrl = "http://" + hostName + ":" + port + bookmarkableUrl;
// .html extension at the end is very important - wkhtmltopdf won't read
// the file if not there
String generatedPdfPath = tempDirPath + "/EMF/" + uuid;
try {
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.command(prepareCommandArguments(fullUrl, generatedPdfPath + PDF_FILE_EXTENSION));
Process start = processBuilder.start();
// One has to handle the error stream
handleStream(start.getErrorStream());
handleStream(start.getInputStream());
// Wait until process is executed.
start.waitFor();
} catch (IOException | InterruptedException e) {
throw new RuntimeException("Error while generating PDF", e);
}
return generatedPdfPath;
}
编辑:添加用于创建带有命令参数的列表的代码:
private List<String> prepareCommandArguments(String inputUrl, String outputUrl) {
List<String> arguments = new ArrayList<>(15);
// absolute path to the wkhtmltopdf executable
arguments.add(wkhtmltopdfLocation);
// Wait until window.status is equal to this string before rendering page
arguments.add("--window-status");
arguments.add("export-ready");
// Set the default text encoding, for input
arguments.add("--encoding");
arguments.add("UTF-8");
// Set an additional HTTP header for system username
arguments.add("--custom-header");
arguments.add("username");
arguments.add(exportUsername);
// Set an additional HTTP header for system user password
arguments.add("--custom-header");
arguments.add("password");
arguments.add(exportPassword);
// Run this additional javascript after the page is done loading
// Used to remove irrelevant divisions and spanning of
// the html page, leaving only the print preview of the document
arguments.add("--run-script");
arguments.add(getScriptFromFile(jsFilePath));
// Bookmarkable url of the document
arguments.add(inputUrl);
// Path to the generated pdf
arguments.add(outputUrl);
return arguments;
}
系统输出。出来println(processBuilder.command())在处理之前。开始():
/root/wk/wkhtmltox/bin/wkhtmltopdf, --window-status, export-ready, --encoding, UTF-8, --custom-header, username, admin, --custom-header, password, admin, --run-script, "\$('.idoc-comments-column').remove(); \$('.idoc-left-column').remove(); \$('.idoc-left-column').remove(); \$('#topHeader').remove(); \$('#header').remove(); \$('.tree-header.breadcrumb_header').remove(); \$('.idoc-middle-column.pull-left.idoc-first-row').remove(); \$('.idoc-middle-column.pull-left').remove(); \$('.pull-left.text-center').remove(); \$('html').addClass('print-override-overflow'); \$('.idoc-editor').css('width', '80%'); \$('.idoc-editor').css('font-size', '14px'); \$('.idoc-editor').css('max-width', 'none'); \$('.idoc-editor').css('margin-left', '10%'); \$('.idoc-editor').css('margin-right', '10%'); \$('.idoc-editor').css('margin-top', '5%'); \$('.idoc-editor').css('margin-bottom', '5%');", http://xx.xx.xx.xx:xxxx/url/page.jsf?param1=1¶m2=2, /root/sandbox/file.pdf
您不需要使用ProcessBuilder进行任何shell转义。尝试按原样传递JS代码,不使用转义的美元符号和双引号。
我想在JAVA程序中执行一个EXE文件。 它工作正常,但我希望EXE的输出立即在我的JAVA程序的文本区域中。 目前,我在“ping”命令完全完成后得到输出(因此JAVA程序挂起了大约3秒)。但是我想马上有结果... 我做错了什么? 突击队向后。 好吧,我想使用这个程序:https://iperf.fr/iperf-download.php 输出如下所示: 不过,我只有在iperf运行后才能得到这
我用ProcessBuilder写了一个java程序来启动CMD提示符 控制台中的输出: SQL*Plus:2015年1月19日星期一14:07:53发布11.2.0.3.0 版权所有(c)1982、2011,Oracle。保留所有权利。 连接到:Oracle Database 11g Enterprise Edition 11.2.0.3.0版-64位生产,包括分区、Oracle标签安全、OLA
问题内容: 此页面- http://labs.qt.nokia.com/2011/10/28/rpath-and- runpath/ -说,大约为了在ld.so库搜索: 然后建议: 运送二进制文件时,请使用RPATH而不是RUNPATH或确保在运行它们之前已设置LD_LIBRARY_PATH。 那么,with的使用是不好的,因为kind- of会取消,因此间接动态加载无法按预期工作?但是,为什么然
正是标题所说的。有没有办法在不安装TCL的情况下使用matplotlib库?请不要告诉我咬紧牙关安装TCL——我知道怎么做,但出于我自己(好吧,也许很愚蠢)的原因,我不想这么做。 我不关心显示的图,我只希望能够输出他们在png。我尝试了各种各样的东西(使用不同的后端等),但是matplotlib总是想找到tcl来工作:(为什么TCL对matplotlib如此重要? 此外,请注意,我正在使用wind
当登录失败时,我试图重定向登录页面上输入的用户名,但在我的控制器中,从“@modelattribute(”user“)”检索的用户的用户名为空。当我不使用spring security时,这是有效的。 我假设form实际上首先发送到spring security,然后重定向到控制器,因此在spring security之间输入的信息丢失。 编辑(解决方案): 谢谢。@James创建一个failur
我在windows服务器上安装了imagemagick,当我尝试使用CMD时,它成功地转换了文件,但当我在php中使用以下代码时:- 它给出了以下错误:- ImagickException:无法打开图像“弧”。pdf“:没有此类文件或目录@错误/blob。c:\wamp\www\test\test中的c/OpenBlob/2638。php第10行 我也试过了 然后给出:- ImagickExcep