PDF Forms

PDF files can be used for interactive forms, containing various types of form fields. HexaPDF supports the creation and processing of these forms.

This example show-cases how to create the various form field types and their possible standard appearances.

The HexaPDF::Type::AcroForm::Form and HexaPDF::Type::AcroForm::Field classes provide a plethora of convenience methods for working with forms, like for creating fields and their widgets, getting field properties like the full hierarchical field name or for setting the field value.

Usage:
ruby acro_form.rb
Resulting PDF:
acro_form.pdf
Preview:

Code

require 'hexapdf'

doc = HexaPDF::Document.new
page = doc.pages.add
canvas = page.canvas

canvas.font("Helvetica", size: 36)
canvas.text("Form Example", at: [50, 750])
form = doc.acro_form(create: true)

canvas.font_size(16)
canvas.text("Check boxes", at: [50, 650])
[:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
  cb = form.create_check_box("Checkbox #{index}")
  widget = cb.create_widget(page, Rect: [200 + 50 * index, 640, 240 + 50 * index, 680])
  widget.background_color(1 - 0.05 * index)
  widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
                      size: 7 * index)
  cb.field_value = true
end

canvas.text("Radio buttons", at: [50, 550])
rb = form.create_radio_button("Radio")
[:check, :circle, :cross, :diamond, :square, :star].each_with_index do |symbol, index|
  widget = rb.create_widget(page, value: :"button#{index}",
                            Rect: [200 + 50 * index, 540, 240 + 50 * index, 580])
  widget.background_color(1 - 0.05 * index)
  widget.marker_style(style: symbol, color: [0.166 * index, 0, 1 - 0.166 * index],
                      size: 7 * index)
end
rb.field_value = :button0

canvas.text("Text fields", at: [50, 480])

canvas.text("Single line", at: [70, 450])
tx = form.create_text_field("Single Line", font_size: 16)
widget = tx.create_widget(page, Rect: [200, 445, 500, 465])
tx.field_value = "A sample test string!"

canvas.text("Multiline", at: [70, 420])
tx = form.create_multiline_text_field("Multiline", font_size: 0, align: :right)
widget = tx.create_widget(page, Rect: [200, 355, 500, 435])
widget.border_style(color: 0, width: 1)
tx.field_value = "A sample test string! " * 30 + "\nNew line\n\nAnother line"

canvas.text("Password", at: [70, 330])
tx = form.create_password_field("Password", font_size: 16)
widget = tx.create_widget(page, Rect: [200, 325, 500, 345])

canvas.text("File select", at: [70, 300])
tx = form.create_file_select_field("File Select", font_size: 16)
widget = tx.create_widget(page, Rect: [200, 295, 500, 315])
tx.field_value = "path/to/file.pdf"

canvas.text("Comb", at: [70, 270])
tx = form.create_comb_text_field("Comb field", max_chars: 10, font_size: 16, align: :center)
widget = tx.create_widget(page, Rect: [200, 250, 500, 285])
widget.border_style(color: [30, 128, 0], width: 1)
tx.field_value = 'Hello'

canvas.text("Combo Box", at: [50, 200])
cb = form.create_combo_box("Combo Box", font_size: 12, editable: true,
                           option_items: ['Value 1', 'Another value', 'Choose me!'])
widget = cb.create_widget(page, Rect: [200, 180, 500, 215])
widget.border_style(width: 1)
cb.field_value = 'Another value'

canvas.text("List Box", at: [50, 150])
lb = form.create_list_box("List Box", font_size: 15, align: :center, multi_select: true,
                         option_items: 1.upto(7).map {|i| "Value #{i}" })
widget = lb.create_widget(page, Rect: [200, 80, 500, 165])
widget.border_style(width: 1)
lb.list_box_top_index = 1
lb.field_value = ['Value 6', 'Value 2']

doc.write('acro_form.pdf', optimize: true)