我正在从Java执行wkhtmltopdf命令行工具,但它抛出了下面的错误。
Cannot run program "wkhtmltopdf": error=2, No such file or directory但是请注意,当我从我的mac终端执行这个命令行工具时,成功地生成了pdf。请看下面的内容。
MacBook-Air-2:~ inDiscover$ wkhtmltopdf /var/folders/7y/2vr28n113p908ksnk0fnpqch0000gn/T/test7896850081571855407.html /Users/mymac/Documents/Project/emailbody/test2.pdf
Loading pages (1/6)
Counting pages (2/6)
Resolving links (4/6)
Loading headers and footers (5/6)
Printing pages (6/6)
Done我在这里看到了很多类似的问题(例如:wkhtmltopdf: No such file or directory [ Closed ]),但这些问题都与$PATH有关。在我的例子中,我相信我已经正确地将可执行文件的路径设置为$PATH。请看下面的内容。
MacBook-Air-2:~ inDiscover$ locate wkhtmltopdf
/private/var/db/receipts/org.wkhtmltopdf.wkhtmltox.bom
/private/var/db/receipts/org.wkhtmltopdf.wkhtmltox.plist
/usr/local/bin/wkhtmltopdf
/usr/local/share/man/man1/wkhtmltopdf.1.gz您可以在这里看到本地已被添加到$PATH (/usr/ wkhtmltopdf /bin)
另外,请参见下面对echo $PATH的响应。
MacBook-Air-2:~ inDiscover$ echo $PATH
/Users/mymac/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
MacBook-Air-2:~ inDiscover$ 只有当我尝试从Java执行命令时,才会遇到此问题。请看我下面的java代码。
String VIEWPORT_SIZE = "2480x3508";
int CONVERSION_DPI = 300;
int IMAGE_QUALITY = 100;
List<String> cmd = new ArrayList<String>(Arrays.asList("wkhtmltopdf",
"--viewport-size", VIEWPORT_SIZE,
"--enable-local-file-access",
// "--disable-smart-shrinking",
"--dpi", String.valueOf(CONVERSION_DPI),
"--image-quality", String.valueOf(IMAGE_QUALITY)));
//cmd.addAll(extParams);
cmd.add("/var/folders/7y/2vr28n113p908ksnk0fnpqch0000gn/T/test7896850081571855407.html");
cmd.add("/Users/mymac/Documents/Project/emailbody/test3.pdf");
try {
ProcessBuilder pb = new ProcessBuilder(cmd);
if (Logger.level.compareTo(LogLevel.Info) >= 0) {
pb.inheritIO();
}
Process p = pb.start();
p.waitFor();
} catch (Exception e) {
e.printStackTrace();
}我是不是真的错过了什么?
发布于 2020-06-27 17:58:17
这里有一些你可以检查的东西,其中一个有望解决你的问题。
我见过的几乎所有java找不到您的shell或终端运行的应用程序的情况都是由于使用了shell /终端中内置的命令(如别名),或者是因为您用来启动java yourapp.ClassName ...的脚本中使用的路径与为交互式shell /终端设置的路径不同。
交互式外壳/终端可能在启动时包含或源自其他脚本-例如,它可能具有~/.bashrc、~/.login、~/.profile等格式的运行代码。这意味着在交互式shell中声明的路径与您启动Java应用程序时呈现给它的路径不同。
因此,您可以看到terminal show PATH具有/usr/local/bin:
MacBook-Air-2:~ inDiscover$ echo $PATH
/Users/mymac/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin但是Java在PATH中说没有/usr/local/bin:
System.out.println("PATH="+System.getenv("PATH"));
/usr/bin:/usr/sbin:/sbin因此,要解决您的问题,可以让java使用绝对路径来运行应用程序wkhtmltopdf:
Arrays.asList("wkhtmltopdf" -> Arrays.asList("/usr/local/bin/wkhtmltopdf" ...或者,您可以让java启动您的shell /终端,这样终端就可以像往常一样获取其环境脚本,并运行以下命令:
# Confirm which shell your Terminal uses:
echo $SHELL如果您使用了SHELL=/bin/bash,那么可以从java运行/bin/bash,并让它找出wkhtmltopdf在哪里:
Arrays.asList("wkhtmltopdf" -> Arrays.asList("/bin/bash", "-c", "wkhtmltopdf" ...或者,如果您有一个脚本runMyApp.sh来启动您的java应用程序,请在java yourclass.Name之前设置路径,
export PATH=/usr/local/bin:$PATH
java yourclass.Name或者,如果您有一个脚本runMyApp.sh来启动您的java应用程序,请使其来源与您的终端相同的配置文件环境。这取决于SHELL,但对于某些系统来说可能是这样的:
#!/bin/bash
# Load env from current user - "source" and "." may or may not work in the SHELL you are using:
source ~/.bashrc
# OR maybe other shell
. ~/.somefilerc
echo $PATH # Now hopefully includes same /usr/local/bin
java yourclass.Namehttps://stackoverflow.com/questions/62576973
复制相似问题