Warm tip: This article is reproduced from serverfault.com, please click

ruby-如何使用大虾/标签在标签上放置图像?

(ruby - How to put an image on a label using Prawn/labels?)

发布于 2020-12-08 05:10:27

我使用Ruby编写脚本,使用Prawn-labels打印书籍的ISBN标签,并使用Barby生成EAN-13条形码。

ISBN来自MySQL。很好 我可以使用Prawn / labels创建一个包含书名的30-up标签PDF。很好

但是,我不太高兴将Barby生成的适当EAN-13条码的PNG图像放在标签上。

这是从数据库中获取信息并生成EAN-13的过程,非常简单:

query = "SELECT ISBN13, Title FROM s_library WHERE Has_barcode != 'y'"
result = client.query(query, symbolize_keys: true)
tags = []
result.each do |row|
    tags << [row[:ISBN13], row[:Title], Barby::EAN13.new(row[:ISBN13].chop)]
end
tags.sort! {|a, b| a[1] <=> b[1]} # Sort by book title

因此,现在我有了一个二维数组,每行包含一个ISBN字符串,一个标题字符串和一个Barby,其中包含ISBN的EAN-13编码(#<Barby :: EAN13:0x00007fc6da13ce98 @ data =“ 978140006215”> )。

现在,我按照Prawn :: Labels的示例进行操作,如果省略#embed_image PNG数据的尝试,则可以成功生成每本书标题为30张的标签:

Prawn::Labels.generate('EAN_tags.pdf', tags, :type => 'Avery5160') do |pdf, tag|
    pdf.font '/Library/Fonts/Erasdemi.TTF'
    pdf.text(tag[1], :align => :center)
    png = Barby::PngOutputter.new(tag[2]).to_png
#   pdf.embed_image(png, Prawn::Images::PNG.new(png), {})
end
`open EAN_tags.pdf`

当我取消对图像嵌入的注释时,我得到了一个我不太了解的神秘回溯:

    25: from /Users/jan/bin/Print_ISBN13.rb:73:in `<main>'
    24: from /usr/local/lib/ruby/gems/2.7.0/gems/prawn-labels-1.2.6/lib/prawn/labels.rb:18:in `generate'
    23: from /usr/local/lib/ruby/gems/2.7.0/gems/prawn-2.3.0/lib/prawn/document.rb:408:in `render_file'
    22: from /usr/local/lib/ruby/gems/2.7.0/gems/prawn-2.3.0/lib/prawn/document.rb:408:in `open'
    21: from /usr/local/lib/ruby/gems/2.7.0/gems/prawn-2.3.0/lib/prawn/document.rb:408:in `block in render_file'
    20: from /usr/local/lib/ruby/gems/2.7.0/gems/prawn-2.3.0/lib/prawn/document.rb:400:in `render'
    19: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/renderer.rb:167:in `render'
    18: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/renderer.rb:202:in `render_body'
    17: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/document_state.rb:72:in `render_body'
    16: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/object_store.rb:70:in `each'
    15: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/object_store.rb:70:in `each'
    14: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/object_store.rb:71:in `block in each'
    13: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/document_state.rb:78:in `block in render_body'
    12: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/reference.rb:26:in `object'
    11: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `pdf_object'
    10: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `each'
     9: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:93:in `block in pdf_object'
     8: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `pdf_object'
     7: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `each'
     6: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:93:in `block in pdf_object'
     5: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `pdf_object'
     4: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:87:in `each'
     3: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:93:in `block in pdf_object'
     2: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:75:in `pdf_object'
     1: from /usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:25:in `utf8_to_utf16'
/usr/local/lib/ruby/gems/2.7.0/gems/pdf-core-0.8.1/lib/pdf/core/pdf_object.rb:25:in `encode': "\\x89" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to UTF-16BE (Encoding::UndefinedConversionError)

我可以将png变量转储到文件中并查看条形码。

从堆栈看来,它似乎想将PNG数据解释为UTF-16字符串。啊。没想到。

关于我在做什么错的任何线索吗?

Questioner
Jan Steinman
Viewed
11
Jan Steinman 2020-12-09 12:24:01

答案似乎是使用一种叫做的东西StringIO,它显然提供了File内存(blob)图像的接口。

因此,我在下面添加了中间行:

    png = Barby::PngOutputter.new(tag[2]).to_png
    str_png = StringIO.new(png)
    pdf.image(str_png)

而不是尝试通过传递二进制数据embed_image,现在我将在最终的PDF输出中获取条形码。(它仍然需要进行一些调整,但是基本概念现在可以使用了。)

我在这里搜索过很多方法-真的!但是“ blob”一词才是本网站上答案