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

Ruby无Rails环境下HAML::Engine渲染图片至PDF失败问题求助

解决Haml渲染图片在PDFKit中不显示的问题

我来帮你搞定这个困扰!你遇到的问题大概率是Haml渲染时的路径处理或者PDFKit的本地资源加载限制导致的,给你几个针对性的解决方案:

1. 确保图片路径是绝对路径(最常见的坑)

虽然你把图片和Haml文件放在同一目录,但Gem运行时的当前工作目录(CWD)不一定是模板文件所在的目录——比如用户安装你的Gem后,运行时的CWD是他们自己的项目目录,这时候相对路径就失效了。

解决方法是在Ruby代码里先获取模板文件的绝对路径,再传给Haml:

# 获取模板所在的绝对目录
template_directory = File.expand_path(File.dirname(__FILE__))
# 拼接图片的绝对路径
image_absolute_path = File.join(template_directory, "your-image.png")

# 初始化Haml引擎并传递路径变量
haml_template = File.read(File.join(template_directory, "template.haml"))
haml_engine = Haml::Engine.new(haml_template)
rendered_html = haml_engine.render(Object.new, image_path: image_absolute_path)

然后在你的Haml文件里使用这个变量:

%img{ src: image_path, alt: "你的图片" }

2. 开启PDFKit的本地文件访问权限

新版的wkhtmltopdf(PDFKit依赖的底层工具)默认禁止加载本地文件,而pdfkit 0.8.2可能需要手动开启这个权限。初始化PDFKit时加上enable_local_file_access参数:

kit = PDFKit.new(rendered_html, enable_local_file_access: true)
pdf_content = kit.to_pdf

如果上面的参数不生效,试试旧的格式(适配pdfkit 0.8.2的语法):

kit = PDFKit.new(rendered_html, :enable_local_file_access => true)

3. 验证Haml渲染后的HTML是否正确

先把Haml渲染出的HTML打印出来,检查img标签的src属性是不是你预期的路径:

puts rendered_html # 查看输出的HTML里img的src值

如果路径不对,说明问题出在Haml的变量传递或者路径拼接上,和PDFKit无关,先把这部分搞定。

4. 确认Gem依赖配置正确

注意你现在只加了开发依赖,但如果你的Gem在运行时需要pdfkit和haml,必须添加运行时依赖:

# 在你的gemspec里
gem.add_runtime_dependency("pdfkit", "0.8.2")
gem.add_runtime_dependency("haml", "~> 5.2") # 替换成你实际使用的Haml版本

开发依赖(add_development_dependency)只在你开发Gem时生效,用户安装你的Gem时不会自动安装这些依赖,所以运行时需要的库一定要加运行时依赖。

先按上面的步骤排查,应该能解决图片不显示的问题!

内容的提问来源于stack exchange,提问作者Sarah A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:28:23