1
votes

Have progressed to get wicked_pdf generating PDF's in Rails 3.2.3. However I want to be able to have links on my pages rendered to screen as HTML from the .html.erb file, but when I review the PDF generated from this template I do not want to see these links.

I had tried to follow what Ryan Bates did in is PDFKit Railscast 220, but its not working for me under Rails 3.2.3, on Ruby 1.9.3.

Here is my an abridged section of the view code:

<h2>Client Setup (Only when Patients module is not available)</h2>
<p>
The setup program installs your Clients module using default settings.  After the installation, you can use this program to customize settings to meet your particular needs.
</p>
<p>
  <%= pdf_image_tag("clients/blank/.png",  alt: "Client Setup (Only when Patients Module is not available) - not-populated") %>
<table>
  <thead>
    <tr>
      <th>Form Item</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Default Value Added Tax (Percent)</td>
      <td>
        The package offers a default Value Added Tax, expressed as a percentage of the invoice, to be added to the invoice.  Numbers from 0 to 999.99 are allowed.
      </td>
    </tr>
  </tbody>
</table>
</p>

<hr />
<form class="form-inline">
  <a href="#to_top" class="btn btn-to_top btn-mini">Back to Top</a>
  <%= link_to "Genie Help Index", help_path, class: "btn btn-main-menu pdf_link" %>
  <p id="pdf_link"><%= link_to "Client Help Index", static_page_path("clients/index"), class: "btn btn-help" %></p>
  <%= link_to "Download PDF", static_page_path(:format => :pdf), class: "btn btn-pdf" %>
  <%= link_to image_tag("file_type_pdf.png", height: "24px", width: "24px" , alt: "Download page as PDF"), static_page_path(:format => :pdf) %>
</form>

<p><%= link_to "Client Help Index", static_page_path("clients/index") %></p>
<p><%= link_to "Download as PDF", static_page_path(:format => "pdf"), class: "pdf_link" %></p>
<p id="pdf_link"><%= link_to "Download as PDF", static_page_path(:format => :pdf) %></p>


<% if request.try(:format).to_s == 'pdf' %>
  <%= link_to "Download this PDF", static_page_path(:format => "pdf") %>
<% end %>

#<% if params[:media] = 'all' %>
#  <%= link_to "Download me as a PDF", static_page_path(:format => "pdf") %>
#<% end %>

<div id="pdf-no"><%= link_to "Get me as a PDF file", static_page_path(:format => "pdf") %></div>

Controller is: (show page is the name of the page to render)

class StaticPages::GenieHelpController < ApplicationController
  def static_page
    respond_to do |format|
      format.html do
        render :template => show_page,
               :layout => 'application'
      end
      format.pdf do
        render :pdf => show_page,
               :layout => 'generic',
               :template => "#{show_page}.html.erb",
               :handlers => :erb,
               :disable_external_links => true,
               :print_media_type => true
      end
    end
  end
end

The layout file in views/layouts/generic.pdf.erb file is as below:

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= wicked_pdf_stylesheet_link_tag    "static_pages/genie_v23_help", :refer_only => true %>
    <!--     <%#= wicked_pdf_stylesheet_link_tag    "static_pages/pdf" %>    --> 
    <%= javascript_include_tag "application" %>
    <%= csrf_meta_tags %>  
  </head>
  <body>
    <div class="container">
      <%= yield %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
</html>

The corresponding css file in old location public/stylesheets/static_pages/genie_help.css:

@media print {
    body { background-color: LightGreen; }
    #container {
                  width: auto;
                  margin: 0;
                  padding: 0;
                  border: 2px;
    }
  #pdf_link {
    display: none;
  }
}
  .pdf_link {
    display: none;
  }

#pdf-no {
    display:none;
}

When I render the html page the links at the bottom show up (as expected) when the format is html.

Rendered PDF but with links still showing - these are what I want to remove BUT How?

What am I doing wrong on with this. I assume if it can be done via middleware of PDFKit then it is supported under wkhtmltopdf as both PDFKit and wicked_pdf are based on this.

Thanks

Mark

1

1 Answers

0
votes

It turned out to be that I solved this problem by mixing-and-matching the four methods in the wicked_helper.pdf file which is based on the lib helper file.

The wicked_pdf_image_tag was changed to pdf_image_tag used in the pull request waiting commit from - mkoentopf

Multi purpose wicked_pdf_helper "Hi there, I've added some code to the wicked_pdf_helper methods. Now they deliver the the full pa…"

  def wicked_pdf_image_tag(img, options={})
    if request.try(:format).to_s == 'application/pdf'
      image_tag "file://#{Rails.root.join('public', 'images', img)}", options rescue nil
    else
      image_tag img.to_s, options rescue nil
    end
  end

What I don't understand is under Rails 3.2 are we still using public directory because sprockets and assests get pre-compiled and placed in public?

The solution I used earlier in the day was to add additional header/footer partials within the html layout, but not in the layout for pdf generation.

Here is the helper file I was using:

module WickedPdfHelper
  def wicked_pdf_stylesheet_link_tag(*sources)
    options = sources.extract_options!
    if request.try(:format).to_s == 'application/pdf'
      #css_dir = Rails.root.join('public','stylesheets')
      css_dir = Rails.root.join('app','assets', 'stylesheets')
      refer_only = options.delete(:refer_only)
      sources.collect { |source|
        source.sub!(/\.css$/o,'')
        if refer_only
          stylesheet_link_tag "file://#{Rails.root.join('public','stylesheets',source+'.css')}", options
        else
          "<style type='text/css'>#{File.read(css_dir.join(source+'.css'))}</style>"
        end
      }.join("\n").html_safe
    else
      sources.collect { |source|
        stylesheet_link_tag(source, options)
      }.join("\n").html_safe
    end
  end

  def pdf_image_tag(img, options={})
    if request.try(:format).to_s == 'application/pdf'
      image_tag "file://#{Rails.root.join('app', 'assets', 'images', img)}", options rescue nil
    else
      image_tag img.to_s, options rescue nil
    end
  end

  def wicked_pdf_javascript_src_tag(jsfile, options={})
    if request.try(:format).to_s == 'application/pdf'
      jsfile.sub!(/\.js$/o,'')
      javascript_src_tag "file://#{Rails.root.join('public','javascripts',jsfile + '.js')}", options
    else
      javascript_src_tag jsfile, options
    end
  end

  def wicked_pdf_javascript_include_tag(*sources)
    options = sources.extract_options!
    sources.collect{ |source| wicked_pdf_javascript_src_tag(source, options) }.join("\n").html_safe
  end
end

It would be good to understand more about how the asset pipeline is used. And how the @media is determined. Is it related to MIME types? If so why do we not need to/or are they not defined in wick_pdf?

I have yet to utilise the page numbering and breaking, but now have an outstanding question that I'll put up separately.