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

使用wicked_pdf_image_tag生成PDF时图片无法加载该如何解决?

修复方案

核心原因

你遇到的问题由两个常见触发点导致:

  • wkhtmltopdf 0.12.6+版本默认关闭了本地文件访问权限,无法直接加载本地路径的静态资源
  • 在Service层手动实例化ApplicationController渲染模板时,缺少正常Web请求的上下文环境,资产辅助方法生成的图片路径为相对路径,wkhtmltopdf无法解析定位到实际的图片文件

分步修改代码

第一步:调整WickedPdf调用参数,开启本地文件访问

修改add_online_signature_to_partner_quote_pdf_service.rb中的generate_signature方法,给pdf_from_string补充权限参数和基础路径参数:

def generate_signature(quote)
  project = quote.project

  ac = ApplicationController.new

  pdf = WickedPdf.new.pdf_from_string(
    ac.render_to_string(
      template: "advanced_admin/quotes/form/_partner_quote_signature.pdf.erb",
      layout: "pdf.html",
      locals: { quote: quote, project: project, pdf: true }
    ),
    # 开启本地文件访问权限
    enable_local_file_access: true,
    # 指定基础路径为项目根目录,用于解析相对路径的资产
    base_url: Rails.root.to_s
  )
end

第二步:调整图片标签写法,直接使用绝对路径

修改_partner_quote_signature.pdf.erb中的图片引用,直接构造本地文件的绝对路径,绕开资产管道的路径解析逻辑:

<div>
  <h1>my title</h1>
  <%= image_tag "file://#{Rails.root.join('app/assets/images/logo-blue.png')}" %>
  <p>my paragraph</p>
</div>

可选验证步骤

如果修改后仍有问题,可以先单独输出生成的signature文件验证是否正常,排除CombinePDF合并环节的异常:

# 临时加在generate_signature方法末尾,调试用
File.open(Rails.root.join('tmp/test_signature.pdf'), 'wb') { |f| f << pdf }

直接打开tmp目录下的test_signature.pdf,如果图片正常显示则说明生成环节没问题,问题出在合并环节,如果仍不显示则继续排查图片路径、文件权限问题。

内容的提问来源于stack exchange,提问作者raphael-allard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:09:02