Class: Pdfrb::Appearance::Generator
- Inherits:
-
Object
- Object
- Pdfrb::Appearance::Generator
- Defined in:
- lib/pdfrb/appearance/generator.rb
Overview
Generates /AP /N appearance streams for form fields and annotations. Each method creates a Form XObject with the field's visual representation and sets it as the /AP /N entry on the field.
For PDF/A-4, /NeedAppearances must be false (or absent), so every field needs a pre-computed appearance stream.
Constant Summary collapse
- DEFAULT_BORDER_WIDTH =
1.0- DEFAULT_FONT_SIZE =
12- DEFAULT_PADDING =
3
Instance Attribute Summary collapse
-
#document ⇒ Object
readonly
Returns the value of attribute document.
Instance Method Summary collapse
-
#button(field, label:, font_name: :Helv) ⇒ Object
Generate appearance for a push button.
-
#checkbox(field, checked:) ⇒ Object
Generate appearance for a checkbox.
-
#combo(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a combo box (dropdown).
-
#initialize(document) ⇒ Generator
constructor
A new instance of Generator.
-
#list_box(field, items:, selected: nil, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a list box field.
-
#radio_button(field, selected:, options: [:Yes]) ⇒ Object
Generate appearance for a radio button.
-
#text_field(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a text field.
Constructor Details
#initialize(document) ⇒ Generator
Returns a new instance of Generator.
20 21 22 |
# File 'lib/pdfrb/appearance/generator.rb', line 20 def initialize(document) @document = document end |
Instance Attribute Details
#document ⇒ Object (readonly)
Returns the value of attribute document.
18 19 20 |
# File 'lib/pdfrb/appearance/generator.rb', line 18 def document @document end |
Instance Method Details
#button(field, label:, font_name: :Helv) ⇒ Object
Generate appearance for a push button.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/pdfrb/appearance/generator.rb', line 77 def (field, label:, font_name: :Helv) rect = field.value[:Rect] return unless rect form = build_form_xobject(rect) do |canvas| draw_border(canvas, rect) if label w = rect[2] - rect[0] h = rect[3] - rect[1] canvas.text(label, at: [w / 3, h / 3], font: font_name, size: DEFAULT_FONT_SIZE) end end set_appearance(field, form) end |
#checkbox(field, checked:) ⇒ Object
Generate appearance for a checkbox.
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/pdfrb/appearance/generator.rb', line 48 def checkbox(field, checked:) rect = field.value[:Rect] return unless rect form = build_form_xobject(rect) do |canvas| draw_border(canvas, rect) if checked draw_check(canvas, rect) end end state_name = checked ? :Yes : :Off set_appearance(field, form, state_name) field.value[:AS] = state_name end |
#combo(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a combo box (dropdown).
69 70 71 |
# File 'lib/pdfrb/appearance/generator.rb', line 69 def combo(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) text_field(field, value: value, font_name: font_name, font_size: font_size) end |
#list_box(field, items:, selected: nil, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a list box field.
119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
# File 'lib/pdfrb/appearance/generator.rb', line 119 def list_box(field, items:, selected: nil, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) rect = field.value[:Rect] return unless rect form = build_form_xobject(rect) do |canvas| draw_border(canvas, rect) items.each_with_index do |item, i| y_pos = (rect[3] - rect[1]) - DEFAULT_PADDING - ((i + 1) * font_size) break if y_pos.negative? if i == selected w = rect[2] - rect[0] canvas.fill_color([0.8, 0.8, 1.0]) canvas.rectangle(0, y_pos - 2, w, font_size + 4) canvas.fill canvas.fill_color([0, 0, 0]) end canvas.text(item.to_s, at: [DEFAULT_PADDING, y_pos], font: font_name, size: font_size) end end set_appearance(field, form) end |
#radio_button(field, selected:, options: [:Yes]) ⇒ Object
Generate appearance for a radio button.
99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/pdfrb/appearance/generator.rb', line 99 def (field, selected:, options: [:Yes]) rect = field.value[:Rect] return unless rect .each do |state| form = build_form_xobject(rect) do |canvas| draw_border(canvas, rect) draw_radio_circle(canvas, rect, selected: state == selected) end set_appearance(field, form, state_name: state.to_sym) end field.value[:AS] = selected.to_sym end |
#text_field(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) ⇒ Object
Generate appearance for a text field.
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/pdfrb/appearance/generator.rb', line 29 def text_field(field, value:, font_name: :Helv, font_size: DEFAULT_FONT_SIZE) rect = field.value[:Rect] return unless rect form = build_form_xobject(rect) do |canvas| draw_border(canvas, rect) if value && !value.to_s.empty? canvas.text(value.to_s, at: [DEFAULT_PADDING, DEFAULT_PADDING], font: font_name, size: font_size) end end set_appearance(field, form) end |