Capturing signatures on a touch device

Posted . Visible to the public.

If you need to capture signatures on an IPad or similar device, you can use Thomas J Bradley's excellent Signature Pad plugin for jQuery Show archive.org snapshot .

To implement, just follow the steps on the Github page Show archive.org snapshot .

The form

If you have a model Signature with name: string, signature: text, you can use it with regular rails form like this:

- form_for @signature, :html => { :class => 'signature_form' } do |form|
  %dl
    %dt
      = form.label :name
    %dd
      = form.text_field :name
    %dt
      = form.label :signature
    %dd
      .sig.sigWrapper{:style => "width: #{Signature::WIDTH}px; height: #{Signature::HEIGHT}px;"}
        %canvas.pad{:width => Signature::WIDTH, :height => Signature::HEIGHT}
        = form.hidden_field :signature, :value => nil, :class => 'output'
         
:javascript
  $(function() {
    $('.signature_form')
    .signaturePad({
      drawOnly: true,
      validateFields: false,
      lineTop: #{Signature::HEIGHT - 30}
    })
    .regenerate(#{JSON.parse(@signature.signature || "[]").to_json});
  });

Generating a PNG

To save the signature as a png on the server, add this to your model (example with Paperclip Show archive.org snapshot ):

class Signature < ActiveRecord::Base
    HEIGHT = 160
    WIDTH = 480
   
    before_save :generate_image
    has_attached_file :image # options ...
    
          private

  def signature_present
    if signature.size <= 2
      errors.add(:signature, :blank)
    end
  end

  def generate_image
    instructions = JSON.parse(signature).map { |h| "line #{h['mx'].to_i},#{h['my'].to_i} #{h['lx'].to_i},#{h['ly'].to_i}" } * ' '
    image = StringIO.new
    Open3.popen3("convert -size #{WIDTH}x#{HEIGHT} xc:transparent -stroke blue -draw @- PNG:-") do |input, output, error|
      input.puts instructions
      input.close
      image.puts(output.read)
    end
    self.image = image
  end
end

Credits for image generation code go to Phil Hofmann Show archive.org snapshot .

Testing

I use the following cucumber step to sign the form. Put the attached file into spec/fixtures.

When /^I sign the form$/ do
  signature = File.read('spec/fixtures/signature.json')
  page.execute_script(<<-JAVASCRIPT)
    $('.signature_form').data('plugin-signaturePad').regenerate(#{signature});
  JAVASCRIPT
end
Profile picture of Tobias Kraze
Tobias Kraze
Last edit
Attachments
License
Source code in this card is licensed under the MIT License.
Posted by Tobias Kraze to makandra dev (2013-02-20 14:26)