8

複数のpngを1つのpdfに保存しようとしています。Endicia Label Server への API 呼び出しから PNG を受信して​​います。これにより、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(/<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

しかし、次のエラーが表示されます。

ASCII-8BIT から UTF-8 への「\x89」

何か案が?

4

3 に答える 3

11

画像データを一時ファイルに書き込む必要はありません。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)
于 2013-02-27T12:23:08.390 に答える
2

問題は、ApiがUTF-8でこのことを返していることです-ですから、私には素晴らしい選択がありません。とにかく、私はこのソリューションが機能していることを発見しました

  file = Tempfile.new('labelimg', :encoding => 'utf-8')
  File.open(file, 'wb') do |f|
    f.write Base64.decode64(@image)
  end
于 2013-02-27T07:05:48.640 に答える
0

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 はマルチバイト形式で、pics などのバイナリ データの転送には使用できません。

于 2013-02-26T13:33:24.260 に答える