【问题标题】:Generating a PDF With Images from Base64 with Prawn使用 Prawn 从 Base64 生成带有图像的 PDF
【发布时间】:2013-02-26 03:57:03
【问题描述】:

我正在尝试将多个 png 保存在一个 pdf 中。我从对 Endicia 标签服务器的 API 调用接收 PNG,它给了我一个 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

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails png base64 prawn


    【解决方案1】:

    不需要将图像数据写入临时文件,Prawn::Document#image 可以接受 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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您无法将 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 是多位格式,不能用于传输图片等二进制数据。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-18
          • 2010-12-27
          • 2015-01-18
          • 1970-01-01
          • 2013-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多