11
votes

I want to generate a PDF with our department logo in it. When I try to use the WickedPdf class in my controller (using the method described at https://github.com/mileszs/wicked_pdf):

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

...the application saves the PDF to the target directory, but it has a blue-and-white '?' mark where the image should be.

If I do this instead:

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

I get the following error:

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

It would appear that my Rails app is also missing / not linking to a helper file belonging to the wicked-pdf gem.

Answers to similar questions on StackOverflow recommend writing a custom "image-tag" helper to locate the image or installing wkhtmltopdf. For me, image-tag shows the logo just fine when placed in a View (whatever.html.erb). "logo.jpg" is already located in both the asset pipeline and #{RailsRoot}/public/images. Finally, I am using wkhtmltopdf 0.9.9, wicked-pdf 0.11.0, and rails 4 on Ubuntu 14.04.

In a nutshell - what am I doing wrong that causes WickedPDF to fail to render the image?

3
wicked_pdf_image_tag is a helper method, and as such it should be used in views, or other helpers. Post some more information about your implementation.Krzysztof Rygielski
What information would be useful? Currently, I trigger the above method controller#some_action with a button on a test page. I have written a test containing the same code in Rspec3 and it does the same thing when I run it - builds the PDF, saves it, puts a question mark where the image should be.NewbieOnRails
As I have said, the wicked_pdf_image_tag is a helper method, so it can't be used (at least it shouldn't be) in controller action. You should make a view, where you'd put in your image, and use that view to generate pdf. But to make long story short - for wicked_pdf the image paths need to be a full, absolute paths, with full file system path or full url (with domain and protocol). I'll try to come up with some simple example and post it here (unless someone beats me to it).Krzysztof Rygielski
You said "I want to generate a PDF with our department logo in it". Is that all you need this code for? A pdf only with an image within? That's what your code sample suggest.Krzysztof Rygielski
We currently have a tool that renders PDFs from user-entered text and attaches them to emails. That part works very well. I'm trying to include our department logo at the top of the PDFs (before the user's text) now. But WickedPDF won't even render a PDF containing only an image_tag. I want to get that working first and build up from there.NewbieOnRails

3 Answers

14
votes

First thing create a pdf template to render and use your wicked_pdf tags in that template.. for example-

app/views/layout/application.pdf.erb-

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

app/views/pdf/pdf_view.pdf.erb-

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

use this template instead

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

This might help you..

0
votes

I converted image url that 'http' from 'https'. Than worked.

Heroku-18
Rails 4.2
wicked_pdf (1.1.0)
wkhtmltopdf-binary (0.12.4)
0
votes

Use the wicked_pdf_image_tag helper in your view and reference the image with asset_url if your image is in public/images or use asset_pack_url if the image is in public/packs/media/images

<%= wicked_pdf_image_tag asset_url('/images/footer_logo.png') %>

or

<%= wicked_pdf_image_tag asset_pack_url('media/images/footer_logo.png') %>