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)