我想在一个pdf中保存多个png . 我从API调用收到的PNG到Endicia Label Server,它给我一个Base64编码图像作为响应 .
基于这个问题:
How to convert base64 string to PNG using Prawn without saving on server in Rails
def batch_order_labels
@orders = Spree::Order.ready_to_ship.limit(1)
dt = Date.current.strftime("%d %b %Y ")
title = "Labels - #{dt} - #{@orders.count} Orders"
Prawn::Document.generate("#{title}.pdf") do |pdf|
@orders.each do |order|
label = order.generate_label
if order.international?
@image = label.response_body.scan(/<Image PartNumber=\"1\">([^<>]*)<\/Image>/imu).flatten.last
else
@image = label.image
end
file = Tempfile.new('labelimg', :encoding => 'utf-8')
file.write Base64.decode64(@image)
file.close
pdf.image file
pdf.start_new_page
end
end
send_data("#{title}.pdf")
end
但我收到以下错误:
“\ x89”从ASCII-8BIT到UTF-8
任何的想法?
3 回答
没有必要将图像数据写入临时文件,Prawn :: Document#图像可以接受StringIO .
尝试替换这个:
有了这个:
问题是,Api以UTF-8返回这个东西 - 所以我没有一个很好的选择 . 无论如何,我发现这个解决方案是有效的
你不能将Base64转换为UTF-8 . 将其保留为纯ASCII:
甚至更好 - 把它留作二进制:
UTF-8是多字节格式,不能用于传输图片等二进制数据 .