首先,在我的开发环境中一切都很好,在生产中也很好,直到我将Rails应用程序更新到Rails 5.2.2和Ruby更新到2.5.3(两者都只是几个小版本(。我更新了一些其他的gem,但无论是邪恶的pdf还是wkhtmltopdf二进制文件都没有更新。我不确定他们的依赖关系。在生产(使用Heroku(时,wicked_pdf
不会渲染来自我的域之外的图像。
以下是我正在使用的宝石:
gem 'wicked_pdf' #version 1.1.0
gem 'wkhtmltopdf-binary' #version 0.12.4
以下代码在开发中有效,但在生产中无效:
<%= image_tag @invoice.job.customer.account.logo.url, width: 220 %>
<%= image_tag @invoice.job.customer.account.logo_url, width: 220 %>
<%= wicked_pdf_image_tag @invoice.job.customer.account.logo_url, width: 220 %>
<img src="<%= @invoice.job.customer.account.logo_url %>" width="220">
显示本地图像在生产中起作用:
<%= image_tag "logo.png" width: 220 %>
我想这与Heroku有关,因为我读过wkhtmltopdf二进制和Heroku的问题,但我的尝试没有带来好运。
所以我不得不使用一个不同的函数,并用它制作了一个助手。embed_remote_image
方法可能是你最感兴趣的,也是我在更大的助手中使用它的方式(它确定它是项目的正面还是背面图像,如果缺失则显示自定义的缺失图像(。
# PDF image include - dont' need link logic, needed for https images
# per https://github.com/mileszs/wicked_pdf/issues/36#issuecomment-91027880
require 'open-uri'
def embed_remote_image(url, content_type)
asset = open(url, "r:UTF-8") { |f| f.read }
base64 = Base64.encode64(asset.to_s).gsub(/s+/, "")
"data:#{content_type};base64,#{Rack::Utils.escape(base64)}"
end
def issue_image_pdf_display(issue, graphic, size, sizeinpx, issuer = nil, nolink = false, chapter_issue = false)
if !graphic.blank?
if graphic == issue.imageback
image_tag(embed_remote_image(issue.imageback_url(size), 'image/png'))
else
image_tag(embed_remote_image(issue.image_url(size), 'image/png'))
end
else
missing_image_display(issue, size, sizeinpx)
end
end
你还需要构建包。https://github.com/dscout/wkhtmltopdf-buildpack.git