邪恶的PDF,从数据库表格图像和样式问题生成PDF

时间:2013-10-08 20:03:41

标签: ruby-on-rails-3 wicked-pdf

我有一个上传器(仅供内部使用),它将HTML文档上传到面向客户的网站中表格的二进制列。面向客户的站点有一个索引,允许用户将该页面视为普通网站(使用send_data h_t.html_code, :type => "html", :disposition => "inline")。我还想让用户能够下载页面的PDF。为此,我正在使用wicked_pdf。

整个问题似乎源于数据存储在数据库中的事实。虽然听起来很奇怪,但对于业务操作而言,我确实可以进行格式化。问题是我看不到任何图像,样式表/样式标签没有任何效果。

我尝试了什么 -

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

使用模板 -

#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) %>

两者都会产生成绩单 - 但两者都没有样式或图像。

创建初始化程序 -

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

什么都没做,我不知道下一步该尝试什么。

作为旁注,查看成绩单HTML版本的代码如下:

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

它不需要查看,因为html数据存储在数据库中,但我得到图像,样式等。一切都适用于HTML版本 - 而不是PDF。

我在ruby 1.8.7上使用rails 3.0.20。

1 个答案:

答案 0 :(得分:0)

解决 -

事实证明,手头有不止一个问题。

1-通过$apt-get install为Ubuntu安装wkhtmltopdf对于我想要的东西并不是很有效...

请参阅http://rubykitchen.in/blog/2013/03/17/pdf-generation-with-rails

(以前没有运行sudo apt-get install openssl build-essential xorg libssl-dev libxrender-dev也可能存在问题,就像我一样,它安装了许多以前没有的组件。)

2-我上传的HTML文件包含图片&amp;破坏格式的样式代码。我用这个修好了......

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

然后,我所要做的就是通过我想删除的哪一行。 (由于'\n'在返回的字符串上调用&#39; raw&#39;而WickedPdf.new.pdf_from_string无法正常运行,我不得不用回车分割parens。)

3- wicked_pdf_stylesheet_link_tag和wicked_pdf_image_tag未定义。我不得不将我想要的样式格式内联到我创建的布局中(结果是wicked_pdf_stylesheet_link_tag使用了我的ruby / rails没有实现的资产管道,这也意味着我必须摆脱javascript助手)并为wicked_pdf_image_tag创建了一个帮助器,在布局中切换要使用的图像标签(image_tag或wicked_pdf_image_tag)。

4-我需要一个.html.erb&amp;我的模板的.pdf.erb,所以我做了两个。

5-通过使用:format => 'html'标记中的:format => 'pdf'link_to,摆脱{{1}},转而使用html或pdf链接。