尝试使用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):
我已经尝试清空我正在渲染的模板和布局的内容,但仍然出现错误。
答案 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)