Ubuntu环境下Golang调用wkhtmltopdf提示‘not found’问题求助
问题描述
我编写了一个将HTML转换为PDF并返回PDF字节数据的Golang方法,代码如下:
import ( "bytes" "github.com/SebastiaanKlippert/go-wkhtmltopdf" ) func HtmlToPdf(htmlData *string) ([]byte, error) { pdfg, err := wkhtmltopdf.NewPDFGenerator() if err != nil { return nil, err } pdfg.AddPage(wkhtmltopdf.NewPageReader(bytes.NewReader([]byte(*htmlData)))) //nolint: gomnd pdfg.Dpi.Set(600) jb, err := pdfg.ToJSON() if err != nil { return nil, err } pdfgFromJSON, err := wkhtmltopdf.NewPDFGeneratorFromJSON(bytes.NewReader(jb)) if err != nil { return nil, err } err = pdfgFromJSON.Create() if err != nil { return nil, err } pdfBytes := pdfgFromJSON.Bytes() return pdfBytes, nil }
调用该方法时返回错误:wkhtmltopdf not found。我已尝试以下解决方案:
- 执行
which wkhtmltopdf得到路径/usr/local/bin/wkhtmltopdf,并在代码中设置环境变量WKHTMLTOPDF_PATH为该路径; - 在
HtmlToPdf方法开头添加wkhtmltopdf.SetPath("/usr/local/bin/wkhtmltopdf"),此时错误变为fork/exec /usr/local/bin/wkhtmltopdf: no such file or directory; - 将wkhtml相关文件移动到
/usr/local/go/bin/并使用该路径; - 通过命令行使用wkhtmltopdf转换URL为PDF可正常运行。
注:终端执行wkhtmltopdf --version显示版本为wkhtmltopdf 0.12.6 (with patched qt),已通过go get github.com/SebastiaanKlippert/go-wkhtmltopdf安装依赖包。
可能的解决方案
1. 检查二进制文件兼容性与依赖
命令行能运行但Go进程调用失败,大概率是架构不匹配或依赖缺失:
- 执行
file /usr/local/bin/wkhtmltopdf查看二进制架构,再用go env GOARCH查看Go编译目标架构,确保两者一致(比如均为amd64或arm64); - 执行
ldd /usr/local/bin/wkhtmltopdf检查依赖库是否全部存在,Go进程运行环境可能和终端不同,若有缺失,安装对应依赖(如Ubuntu下的libxrender1、libfontconfig1等)。
2. 验证权限与路径正确性
- 确保
/usr/local/bin/wkhtmltopdf对Go进程运行用户有可执行权限,执行chmod +x /usr/local/bin/wkhtmltopdf修复权限; - 在代码中设置路径时,避免拼写错误,直接用绝对路径常量:
func HtmlToPdf(htmlData *string) ([]byte, error) { err := wkhtmltopdf.SetPath("/usr/local/bin/wkhtmltopdf") if err != nil { return nil, err } // 后续生成PDF逻辑 pdfg, err := wkhtmltopdf.NewPDFGenerator() // ... }
3. 简化代码,移除冗余JSON序列化
原代码中先将PDF生成器转JSON再重新加载的步骤完全冗余,可能导致配置失效,简化后代码:
func HtmlToPdf(htmlData *string) ([]byte, error) { err := wkhtmltopdf.SetPath("/usr/local/bin/wkhtmltopdf") if err != nil { return nil, err } pdfg, err := wkhtmltopdf.NewPDFGenerator() if err != nil { return nil, err } pdfg.AddPage(wkhtmltopdf.NewPageReader(bytes.NewReader([]byte(*htmlData)))) pdfg.Dpi.Set(600) err = pdfg.Create() if err != nil { return nil, err } return pdfg.Bytes(), nil }
4. 检查Go进程环境变量
Go进程的环境变量可能与终端不同,比如PATH未包含/usr/local/bin,可在代码中打印验证:
import "os" // 在方法开头添加 fmt.Println("PATH:", os.Getenv("PATH")) fmt.Println("WKHTMLTOPDF_PATH:", os.Getenv("WKHTMLTOPDF_PATH"))
若PATH缺失目标路径,手动添加:
os.Setenv("PATH", os.Getenv("PATH")+":/usr/local/bin")
5. 重新编译对应架构的wkhtmltopdf
若确认架构不匹配,下载或编译对应架构的wkhtmltopdf二进制包替换现有文件。
内容的提问来源于stack exchange,提问作者vishal
相关产品推荐
相关产品推荐

