2016-07-27 50 views
1

在rails 4中,我正在使用wicked_pdf gem來下載.pdf文件。我必須在這個pdf中添加一個圖像,現在圖像在開發中通過wicked_pdf_image_tag呈現,但在測試環境圖像(s3)中不呈現。Rails 4,如何將s3圖像添加到惡意pdf

二手寶石是,

gem 'wicked_pdf', '1.0.3' 
gem 'wkhtmltopdf-binary', '0.9.9.3' 

在初始化器,

class WickedPdf 
    wkhtmltopdf_path = Rails.env.production? ? "#{Rails.root}/bin/wkhtmltopdf-amd64" : "#{Rails.root}/bin/wkhtmltopdf-amd64" 
    WICKED_PDF = { 
    :exe_path => wkhtmltopdf_path, 
    :wkhtmltopdf => wkhtmltopdf_path 
    } 
end 

在控制器,

respond_to do |format| 
    format.html { 
    render :pdf => "sample", 
    :margin => {:top => 10, :bottom => 10, :left => 10, :right => 10}, 
    :orientation => 'Portrait', # default , Landscape, 
    :no_background => true 
    } 
end 

在視圖,我曾嘗試通過

<%= Rails.env.development? ? wicked_pdf_image_tag("img/logo.png") : wicked_pdf_image_tag("#{Rails.root}/public/assets/img/logo.png") %> 

<%= Rails.env.development? ? wicked_pdf_image_tag("img/logo.png") : wicked_pdf_image_tag("#{Rails.root}/assets/img/logo.png") %> 

<%= image_tag(ActionController::Base.helpers.asset_path('img/logo.png')) %> 
加載

如何在pdf文件中加載s3圖像?

回答

2

您可以將圖像放在s3存儲桶中並將其公開。之後,嘗試下面。如果你使用下面的代碼,不需要爲不同的環境使用單獨的語法,它將適用於所有.Hop它的工作原理。

<%= wicked_pdf_image_tag('//s3.amazonaws.com/bucket_name/image.png') %> 
2

我曾在類似的功能,但使用PDFKit寶石。但我認爲渲染邏輯幾乎相似。

下面是我渲染我在局部控制器

def print_batch 
    batch = Batch.find(params[:id]) 
    respond_to do |format| 
    format.pdf { 
     html = render_to_string("_batch",:formats => [:html], layout: false , locals: { batch: batch }) 
     Rails.logger.debug(html.inspect) 
     kit = PDFKit.new(html) 
     send_data(kit.to_pdf, :filename => "file_name_#{batch.id}.pdf", :type => 'application/pdf') and return 
    } 
    format.html 
    format.json { render json: {id: batch.id, processed: batch.processed?} } 
    end  

end 

_batch.html.haml的代碼。你可以看到我已經使用person.s3_logo來渲染PDF圖像。

- logo_image_pdf = person.logo.present? ? person.s3_logo : default_credit_logo 
    - logo_image_html = person.logo.present? ? image_path(Person.logo.thumb('100x100').url) : image_path('default_credit_logo.png') 
    - logo_image = params[:format] == 'pdf' ? logo_image_pdf : logo_image_html 

    .bucks   
    %img.logo{src: logo_image } 

Person.rb模型。無論如何,我們無法直接從s3直接渲染PDF文件中的圖像。所以任何寶石首先將它下載到/ tmp文件夾並渲染它。這是我在模型文件中完成的。

def s3_logo 
    file = open(self.logo.remote_url) 
    file.path if file 
    end