9

尝试使用 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

4 回答 4

13

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

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

f = Tempfile.open(%w(my .pdf))
f.binmode
f << pdf
f.close
于 2015-04-08T00:14:53.170 回答
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。在强制一些依赖项获取更高版本的 gem 之后,我现在可以在没有 #force_encoding 的情况下运行,就像我之前使用 rails 3 所做的那样。

于 2013-06-17T21:22:39.893 回答
0

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

尝试删除:

WickedPdf.new.pdf_from_string

所以上面写着:

pdf = render_from_string( pdf: ....

于 2013-06-14T16:09:35.330 回答
0

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

body = File.read('raw.txt')
puts body.encode('ASCII-8BIT', :invalid => :replace, :undef => :replace)
于 2013-06-24T20:41:03.530 回答