RuntimeError(无法执行:错误:“\ xFE”从ASCII-8BIT到UTF-8):

时间:2013-06-11 14:08:30

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

尝试使用Wicked PDF。

我在控制器中有这段代码

  def pdf
  pdf = WickedPdf.new.pdf_from_string(
  render_to_string(
  pdf: 'filename.pdf',
  template: '/pages/poa.html.slim',
  layout: '/layouts/pdf'),
  header: {
      content: render_to_string({
          template: '/pdfs/poa_header.html.slim',
          layout: '/layouts/pdf'
      })
  })

   save_path = [Rails.root, '/public/pdf/', 'filename.pdf'].join
   File.open(save_path, 'wb') do |file | file << pdf
   end
   end

我在尝试执行上面的操作时收到此错误消息

RuntimeError (Failed to execute:

Error: "\xFE" from ASCII-8BIT to UTF-8):

我已经尝试清空我正在渲染的模板和布局的内容,但仍然出现错误。

4 个答案:

答案 0 :(得分:12)

如果您尝试写入未处于二进制模式的文件,则会发生这种情况。

使用&#39; b&#39;打开文件。标记File.open(file_path, 'wb'),或者如果您已经有文件句柄,可以在写入之前将其切换为二进制模式:

f = Tempfile.open(%w(my .pdf))
f.binmode
f << pdf
f.close

答案 1 :(得分:6)

我自己也遇到了这个问题。奇怪的是,只有当我在Rails 4.rc2下运行时才会发生(在Rails 3.2.13下运行正常)。我通过强制生成的pdf字符串编码为UTF-8来解决它。

所以在你的例子中,尝试这样的事情:

File.open(save_path, 'wb') do |file | file << pdf.force_encoding("UTF-8")

虽然上述内容为我解决了问题,但我发现根本问题实际上是在升级到Rails 4.rc2的过程中降级的一些宝石。在强制某些依赖关系获得后来的gem版本后,我现在可以在没有#force_encoding的情况下运行,就像之前使用rails 3一样。

答案 2 :(得分:0)

我使用WickedPdf.new.pdf_from_string得到完全相同的错误。

尝试删除:

WickedPdf.new.pdf_from_string

所以它写着:

pdf = render_from_string(pdf:....

答案 3 :(得分:0)

这是来自模板代码中某处出现的特殊字符(例如来自MS-Word粘贴的卷曲引号)。我使用这段代码来找到它发生的确切位置:

body = File.read('raw.txt')
puts body.encode('ASCII-8BIT', :invalid => :replace, :undef => :replace)