Class: Pdfrb::Appearance::Generator

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#documentObject (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.

Parameters:

  • field (Pdfrb::Model::Type::Annotation)

    the Widget/field.

  • label (String)

    the button label.

  • font_name (Symbol) (defaults to: :Helv)

    resource name of the font.



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 button(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.

Parameters:



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).

Parameters:

  • field (Pdfrb::Model::Type::Annotation)

    the Widget/field.

  • value (String)

    the selected value.

  • font_name (Symbol) (defaults to: :Helv)

    resource name of the font.

  • font_size (Integer) (defaults to: DEFAULT_FONT_SIZE)

    point size.



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.

Parameters:

  • field (Pdfrb::Model::Type::Annotation)

    the Widget/field.

  • items (Array<String>)

    the list items to show.

  • selected (Integer, nil) (defaults to: nil)

    index of the selected item.

  • font_name (Symbol) (defaults to: :Helv)

    resource name of the font.

  • font_size (Integer) (defaults to: DEFAULT_FONT_SIZE)

    point size.



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.

Parameters:

  • field (Pdfrb::Model::Type::Annotation)

    the Widget/field.

  • selected (String)

    the selected state name (e.g. :Yes).

  • options (Array<String>) (defaults to: [:Yes])

    all possible state names.



99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/pdfrb/appearance/generator.rb', line 99

def radio_button(field, selected:, options: [:Yes])
  rect = field.value[:Rect]
  return unless rect

  options.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.

Parameters:

  • field (Pdfrb::Model::Type::Annotation)

    the Widget/field.

  • value (String)

    the text value to display.

  • font_name (Symbol) (defaults to: :Helv)

    resource name of the font.

  • font_size (Integer) (defaults to: DEFAULT_FONT_SIZE)

    point size.



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