使用Base64中的图像生成带有图像的PDF

我想在一个pdf中保存多个png。 我从API调用收到的PNG到Endicia Label Server,它给我一个Base64编码图像作为响应。

基于这个问题:

如何在不保存Rails服务器的情况下使用Prawn将base64字符串转换为PNG

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(/([^]*)/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

任何的想法?

没有必要将图像数据写入临时文件,Prawn :: Document#图像可以接受StringIO。

尝试替换这个:

 file = Tempfile.new('labelimg', :encoding => 'utf-8') file.write Base64.decode64(@image) file.close pdf.image file 

有了这个:

 require 'stringio' ..... image_data = StringIO.new( Base64.decode64(@image) ) pdf.image(image_data) 

问题是,Api以UTF-8返回这个东西 – 所以我没有一个很好的选择。 无论如何,我发现这个解决方案是有效的

  file = Tempfile.new('labelimg', :encoding => 'utf-8') File.open(file, 'wb') do |f| f.write Base64.decode64(@image) end 

你不能将Base64转换为UTF-8。 将其保留为纯ASCII:

  file = Tempfile.new('labelimg', :encoding => 'ascii-8bit') file.write Base64.decode64(@image) file.close 

甚至更好 – 将其保留为二进制:

  file = Tempfile.new('labelimg') file.write Base64.decode64(@image) file.close 

UTF-8是多字节格式,不能用于传输图片等二进制数据。