Question

I have an uploader (internal use only) that will upload an HTML document to a binary column of a table in my client-facing website. The client facing site has an index that allows the user to view the page as a normal website (using send_data h_t.html_code, :type => "html", :disposition => "inline"). I also want to give the user the ability to download a PDF of the page. For that I'm using wicked_pdf.

The entire problem seems to stem from the fact that the data is stored in the database. As strange as it sounds, it is vital to business operations that I get formatting exact. The issue is I can't see any image, and the stylesheets/style tags don't have any effect.

What I've tried-

Gsub-

def show
  html = HtmlTranscript.find(params[:id])
  html_code = html.html_code.gsub('<img src="/images/bwTranscriptLogo.gif" alt="Logo">','<%= wicked_pdf_image_tag "bwTranscriptLogo.gif" %>')
  html_code = html_code.gsub('<link rel="StyleSheet" href="" type="text/css">','<%= wicked_pdf_stylesheet_link_tag "transcripts.css" %>')
  transcript = WickedPdf.new.pdf_from_string(html_code)

  respond_to do |format|
    format.html do
      send_data transcript, :type => "pdf", :disposition => "attachment"
    end
##### i never could get this part figured out, so if you have a fix for this...
#      format.pdf do
#      render :pdf => "transcript_for_#{@html.created_at}", :template => "html_transcripts/show.html.erb", :layout => false
#      end
    end
  end

Using a template-

#Controller (above, modified)
html = HtmlTranscript.find(params[:id])
@html_code = html.html_code.gsub('<img src="/images/bwTranscriptLogo.gif" alt="Logo">','<%= wicked_pdf_image_tag "bwTranscriptLogo.gif" %>')
@html_code = @html_code.gsub('<link rel="StyleSheet" href="" type="text/css">','<%= wicked_pdf_stylesheet_link_tag "transcripts.css" %>')
transcript = WickedPdf.new.pdf_from_string(render_to_string(:template => "html_transcripts/show.html.erb", :layout => false))


#view
<!-- tried with stylesheet & image link tags, with wicked_pdf stylesheet & image link tags, with html style & img tags, etc -->
<%= raw(@html_code) %>

And both will generate a transcript- but neither will have style OR image.

Creating an initializer-

module WickedPdfHelper
  def wicked_pdf_stylesheet_link_tag(*sources)
    sources.collect { |source|
      "<style type='text/css'>#{Rails.application.assets.find_asset("#{source}.css")}</style>"
    }.join("\n").gsub(/url\(['"](.+)['"]\)(.+)/,%[url("#{wicked_pdf_image_location("\\1")}")\\2]).html_safe
  end

  def wicked_pdf_image_tag(img, options={})
    image_tag wicked_pdf_image_location(img), options
  end

  def wicked_pdf_image_location(img)
    "file://#{Rails.root.join('app', 'assets', 'images', img)}"
  end

  def wicked_pdf_javascript_src_tag(source)
    "<script type='text/javascript'>#{Rails.application.assets.find_asset("#{source}.js").body}</script>"
  end

  def wicked_pdf_javascript_include_tag(*sources)
    sources.collect{ |source| wicked_pdf_javascript_src_tag(source) }.join("\n").html_safe
  end
end

did absolutely nothing, and I have no idea what to try next.

As a side note, the code to view the HTML version of the transcript is as follows:

def transcript_data
  h_t = HtmlTranscript.find(params[:id])
  send_data h_t.html_code, :type => "html", :disposition => "inline"
end

It requires no view, as the html data is stored in the database, but I get image, style, etc. Everything works with the HTML version- just not the PDF.

I'm on ruby 1.8.7 with rails 3.0.20.

Was it helpful?

Solution

Solved-

As it turns out, there was more than one issue at hand.

1- Installation of wkhtmltopdf for Ubuntu via $apt-get install does not quite do the trick for what I wanted...

see http://rubykitchen.in/blog/2013/03/17/pdf-generation-with-rails

(there may have also been an issue with having not previously run sudo apt-get install openssl build-essential xorg libssl-dev libxrender-dev, as when I did, it installed a number of components I did not previously have.)

2- The HTML files I had uploaded contained image & style code that was breaking the formatting. I fixed it with this...

def rm_by_line(which = 0, line1 = 0, line2 = 0)
  h_t = HtmlTranscript.find(which)
  line_by_line = h_t.html_code.split('
')
  for i in line1..line2
    line_by_line[i] = ''
  end
  line_by_line = line_by_line.join('
').strip

  return line_by_line
end

Then, all I had to do was pass which lines I wanted to remove. (I had to split the parens with a carriage return because '\n' didn't function properly when calling 'raw' on the returned string.)

3- wicked_pdf_stylesheet_link_tag and wicked_pdf_image_tag were undefined. I had to inline the style formatting I wanted into a layout I created (turns out wicked_pdf_stylesheet_link_tag used asset pipeline wich my ruby/rails did not implement, which also means I had to get rid of the javascript helpers) and created a helper for wicked_pdf_image_tag, making a switch in the layout for which image tag (image_tag or wicked_pdf_image_tag) to be used.

4- I needed both a .html.erb & a .pdf.erb for my templates, so I made both.

5- Got rid of WickedPdf.new.pdf_from_string in favor of linking to either html or pdf by using :format => 'html' or :format => 'pdf' in the link_to tag.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top