You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:45:34