首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法运行程序"wkhtmltopdf":error=2,没有这样的文件或目录-从Java获取此错误

无法运行程序"wkhtmltopdf":error=2,没有这样的文件或目录-从Java获取此错误
EN

Stack Overflow用户
提问于 2020-06-25 21:50:40
回答 1查看 672关注 0票数 0

我正在从Java执行wkhtmltopdf命令行工具,但它抛出了下面的错误。

代码语言:javascript
复制
Cannot run program "wkhtmltopdf": error=2, No such file or directory

但是请注意,当我从我的mac终端执行这个命令行工具时,成功地生成了pdf。请看下面的内容。

代码语言:javascript
复制
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。请看下面的内容。

代码语言:javascript
复制
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的响应。

代码语言:javascript
复制
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代码。

代码语言:javascript
复制
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();
        }

我是不是真的错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-06-27 17:58:17

这里有一些你可以检查的东西,其中一个有望解决你的问题。

我见过的几乎所有java找不到您的shell或终端运行的应用程序的情况都是由于使用了shell /终端中内置的命令(如别名),或者是因为您用来启动java yourapp.ClassName ...的脚本中使用的路径与为交互式shell /终端设置的路径不同。

交互式外壳/终端可能在启动时包含或源自其他脚本-例如,它可能具有~/.bashrc~/.login~/.profile等格式的运行代码。这意味着在交互式shell中声明的路径与您启动Java应用程序时呈现给它的路径不同。

因此,您可以看到terminal show PATH具有/usr/local/bin:

代码语言:javascript
复制
MacBook-Air-2:~ inDiscover$ echo $PATH
/Users/mymac/anaconda/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

但是Java在PATH中说没有/usr/local/bin:

代码语言:javascript
复制
System.out.println("PATH="+System.getenv("PATH"));
/usr/bin:/usr/sbin:/sbin

因此,要解决您的问题,可以让java使用绝对路径来运行应用程序wkhtmltopdf:

代码语言:javascript
复制
Arrays.asList("wkhtmltopdf" ->  Arrays.asList("/usr/local/bin/wkhtmltopdf" ...

或者,您可以让java启动您的shell /终端,这样终端就可以像往常一样获取其环境脚本,并运行以下命令:

代码语言:javascript
复制
# Confirm which shell your Terminal uses:
echo $SHELL

如果您使用了SHELL=/bin/bash,那么可以从java运行/bin/bash,并让它找出wkhtmltopdf在哪里:

代码语言:javascript
复制
Arrays.asList("wkhtmltopdf" ->  Arrays.asList("/bin/bash", "-c", "wkhtmltopdf" ...

或者,如果您有一个脚本runMyApp.sh来启动您的java应用程序,请在java yourclass.Name之前设置路径,

代码语言:javascript
复制
export PATH=/usr/local/bin:$PATH
java yourclass.Name

或者,如果您有一个脚本runMyApp.sh来启动您的java应用程序,请使其来源与您的终端相同的配置文件环境。这取决于SHELL,但对于某些系统来说可能是这样的:

代码语言:javascript
复制
#!/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.Name
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62576973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档