WickedPdf不在生产中显示来自S3的远程图像

时间:2018-12-12 16:19:38

标签: ruby-on-rails ruby heroku ruby-on-rails-5 wicked-pdf

首先,在我的开发环境中一切正常,在生产环境中一切正常,直到我将Rails应用程序更新到Rails 5.2.2,并将Ruby更新到2.5.3(两者都只有几个次要版本)。我更新了许多其他的gem,但是邪恶的pdf或wkhtmltopdf-binary都没有更新。我不确定他们的依赖性。在生产中(使用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-binary和Heroku的问题,但是从我所做的尝试中没有运气。

1 个答案:

答案 0 :(得分:0)

因此,我不得不使用其他功能,并从中获得帮助。 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

您还需要buildpack。 https://github.com/dscout/wkhtmltopdf-buildpack.git