使用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
相关产品推荐
相关产品推荐

