2015-05-07 180 views
6

我想生成一个带有我们部门标识的PDF。当我尝试使用我的控制器的WickedPdf类(使用在https://github.com/mileszs/wicked_pdf描述的方法):Wicked-PDF未显示图像,'wicked_pdf_image_tag'undefined

def some_action 
    image_tag_string = image_tag('logo.jpg') 
    pdf = WickedPdf.new.pdf_from_string(image_tag_string) 

    save_path = Rails.root.join('testpdfs','logotest.pdf') 
    File.open(save_path, 'wb') do |file| 
    file << pdf 
    end 
end 

...的应用程序保存PDF到目标目录,但它有一个蓝色和白色“ ?标记图像应该在哪里。

如果我这样做,而不是:

image_tag_string = wicked_pdf_image_tag('logo.jpg') 
    pdf = WickedPdf.new.pdf_from_string(image_tag_string) 

我收到以下错误:

NoMethodError: 
    undefined method `wicked_pdf_image_tag' for #<... 

这样看来,我的Rails应用程序也不见了/没有连接到属于一个帮助文件邪恶-PDF宝石。

对StackOverflow上类似问题的回答建议编写一个自定义的“图像标签”助手来定位图像或安装wkhtmltopdf。对我来说,放置在视图(whatever.html.erb)中时,image-tag会显示徽标。 “logo.jpg”已经位于资产管道和#{RailsRoot}/public/images中。最后,我在Ubuntu 14.04上使用了wkhtmltopdf 0.9.9,wicked-pdf 0.11.0和rails 4。

简而言之 - 我做错了什么导致WickedPDF无法呈现图像?

+0

'wicked_pdf_image_tag'是一个辅助方法,因此它应该在的意见,或其他帮助使用。发布更多关于您的实施的信息。 –

+0

什么信息会有用?目前,我使用测试页上的按钮来触发上述方法控制器#some_action。我在Rspec3中编写了一个包含相同代码的测试,并且在运行它时执行了相同的操作 - 构建PDF,保存它,在图像应该放置的位置放置问号。 – NewbieOnRails

+1

正如我所说的,'wicked_pdf_image_tag'是一个辅助方法,所以在控制器操作中它不能被使用(至少它不应该)。您应该查看,放置图像的位置,然后使用该视图生成pdf。但要长话短说 - 对于wicked_pdf,图像路径需要是完整的绝对路径,具有完整的文件系统路径或完整的url(带有域和协议)。我会试着想出一些简单的例子,并将其发布在这里(除非有人击败我)。 –

回答

12

第一件事就是创建一个PDF模板渲染和在模板中使用您的wicked_pdf标签.. 的示例 -

应用程序/视图/布局/ application.pdf.erb-

<!doctype html> 
<html> 
    <head> 
    <meta charset='utf-8' /> 
    </head> 
    <body onload='number_pages'> 
    <div id="content"> 
     <%= yield %> 
    </div> 
    </body> 
</html> 

应用/views/pdf/pdf_view.pdf.erb-

<div> 
    <%= wicked_pdf_image_tag 'logo.jpg' %> 
</div> 

使用这个模板代替

def save 
    pdf = WickedPdf.new.pdf_from_string(
         render_to_string(
          template: 'example/pdf_view.pdf.erb', 
          layout: 'layouts/application.pdf.erb')) 
    send_data(pdf, 
      filename: 'file_name.pdf', 
      type: 'application/pdf', 
      disposition: 'attachment') 
end 

这可以帮助你..