embedding barcode generated with barby gem into the prawn document

pdf, pdf-generation, prawn, ruby, ruby-on-rails-4

Solution

EDIT

In your `InvoicePdf` class, change the `barcode` method to:

def barcode
  barcode = Barby::Code39.new @order.order_number
  barcode.annotate_pdf(self)
end

The `annotate_pdf` method takes a `Prawn::Document` as its argument, which is `self` here.

Original Answer

If you want to create a new pdf with your barcode, you can just do:

def barcode
  _barcode = Barby::Code39.new(@order.order_number)
  outputter = Barby::PrawnOutputter.new(_barcode)
  outputter.to_pdf
end

Note that you can specify pdf options (including height, margins, page size, etc.) on the new `PrawnOutputter` or on the `to_pdf` call. See the documentation for more details: https://github.com/toretore/barby/wiki/Outputters and http://rdoc.info/github/toretore/barby/Barby/PrawnOutputter.

And if you want to write it to a file do:

File.open("my_file.pdf","w") { |f| f.print barcode }

Note that you can also just call `_barcode.to_pdf`, which seems to have the same effect as creating a new `PrawnOutputter`, but this functionality is not described in the Barby documentation.

If you have an existing pdf document (as a `Prawn::Document`) that you want to write a barcode to, note that you could do:

def barcode(p_pdf)
  _barcode = Barby::Code39.new(@order.order_number)
  _barcode.annotate_pdf(p_pdf) 
end

Problem

From my controller I create pdf: ``` def show @order = Order.find(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @order } format.pdf do pdf = InvoicePdf.new(@order, view_context) send_data pdf.render, filename: "invoice_#{@order.order_number}.pdf", type: "application/pdf", disposition: "inline", size: 10 end end end ``` invoice_pdf.rb: ``` require 'barby' require 'barby/barcode/code_39' require 'barby/outputter/prawn_outputter' class InvoicePdf < Prawn::Document def initialize(order, view) super({ :top_margin => 70, :page_size => 'A4', :font_size => 10, :text => 8 }) @order = order @view = view order_number barcode end def order_number text "Order #{@order.order_number}" end def barcode barcode = Barby::Code39.new @order.order_number barcode.annotate_pdf(XXXX) end end ``` How should I modify my barcode method or the options marked as XXXX to embed barcode into PDF document?

Original source