Generating a PDF With Images from Base64 with Prawn

情到浓时终转凉″ 提交于 2019-12-07 03:49:47

问题


I am trying to save multiple pngs in one pdf. I'm receiving the PNGs from an API Call to the Endicia Label Server, which is giving me a Base64 Encoded Image as response.

Based on this Question:

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

But I'm receiving following error:

"\x89" from ASCII-8BIT to UTF-8

Any Idea?


回答1:


There's no need to write the image data to a tempfile, Prawn::Document#image can accept a StringIO.

Try replacing this:

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

With this:

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



回答2:


The Problem is, that the Api is returning this thing in UTF-8 - So I dont have a great choice. Anyhow, I found this solution to be working

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



回答3:


you can't convert the Base64 to UTF-8. Leave it as plain ASCII:

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

or even better - leave it as binary:

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

UTF-8 is multibite format and it's not usable for transferring binary data such as pics.



来源:https://stackoverflow.com/questions/15081079/generating-a-pdf-with-images-from-base64-with-prawn

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!