Class: HexaPDF::Layout::PageStyle
- Inherits:
-
Object
- Object
- HexaPDF::Layout::PageStyle
- Defined in:
- lib/hexapdf/layout/page_style.rb
Overview
A PageStyle defines the dimensions of a page, its initial look, the Frame for object placement and which page style should be used next.
This class is used by HexaPDF::Composer to style the individual pages.
Instance Attribute Summary collapse
-
#frame ⇒ Object
The Frame object that defines the area for the last page created with #create_page where content should be placed.
-
#next_style ⇒ Object
Defines the name of the page style that should be used for the next page.
-
#orientation ⇒ Object
The page orientation, either
:portrait
or:landscape
. -
#page_size ⇒ Object
The page size.
-
#template ⇒ Object
A callable object that defines the initial content of a page created with #create_page.
Instance Method Summary collapse
-
#create_frame(page, margin = 36) ⇒ Object
Creates a frame based on the given page’s box and margin.
-
#create_page(document) ⇒ Object
Creates a new page in the given document using this page style and returns it.
-
#initialize(page_size: :A4, orientation: :portrait, next_style: nil, &block) ⇒ PageStyle
constructor
Creates a new page style instance for the given page size, orientation and next style values.
Constructor Details
#initialize(page_size: :A4, orientation: :portrait, next_style: nil, &block) ⇒ PageStyle
Creates a new page style instance for the given page size, orientation and next style values. If a block is given, it is used as #template for defining the initial content of a page.
Example:
PageStyle.new(page_size: :Letter) do |canvas, style|
style.frame = style.create_frame(canvas.context, 72)
style.next_style = :other
canvas.fill_color("fd0") { canvas.circle(100, 100, 50).fill }
end
114 115 116 117 118 119 120 |
# File 'lib/hexapdf/layout/page_style.rb', line 114 def initialize(page_size: :A4, orientation: :portrait, next_style: nil, &block) @page_size = page_size @orientation = orientation @template = block @frame = nil @next_style = next_style end |
Instance Attribute Details
#frame ⇒ Object
The Frame object that defines the area for the last page created with #create_page where content should be placed.
This value is usually updated during execution of the #template. If the value is not updated, a frame covering the page except for a default margin on all sides is set during #create_page.
94 95 96 |
# File 'lib/hexapdf/layout/page_style.rb', line 94 def frame @frame end |
#next_style ⇒ Object
Defines the name of the page style that should be used for the next page.
Note that this value can be different each time a new page is created via #create_page.
If this attribute is nil
(the default), it means that this style should be used again.
101 102 103 |
# File 'lib/hexapdf/layout/page_style.rb', line 101 def next_style @next_style end |
#orientation ⇒ Object
The page orientation, either :portrait
or :landscape
.
Only used if #page_size is one of the predefined page sizes and not an array.
64 65 66 |
# File 'lib/hexapdf/layout/page_style.rb', line 64 def orientation @orientation end |
#page_size ⇒ Object
The page size.
Can be any valid predefined page size (see HexaPDF::Type::Page::PAPER_SIZE) or an array
- llx, lly, urx, ury
-
specifying a custom page size.
Example:
style.page_size = :A4
style.page_size = [0, 0, 200, 200]
59 60 61 |
# File 'lib/hexapdf/layout/page_style.rb', line 59 def page_size @page_size end |
#template ⇒ Object
A callable object that defines the initial content of a page created with #create_page.
The callable object is given a canvas and the page style as arguments. It needs to draw the initial content of the page. Note that the graphics state of the canvas is not saved before executing the template code and restored afterwards. If this is needed, the object needs to do it itself. The #next_style attribute can optionally be set.
Furthermore, the callable object should set the #frame that defines the area on the page where content should be placed. The #create_frame method can be used for easily creating a rectangular frame.
Example:
page_style.template = lambda do |canvas, style|
box = canvas.context.box
canvas.fill_color("fd0") do
canvas.rectangle(0, 0, box.width, box.height).fill
end
style.frame = style.create_frame(canvas.context, 72)
end
86 87 88 |
# File 'lib/hexapdf/layout/page_style.rb', line 86 def template @template end |
Instance Method Details
#create_frame(page, margin = 36) ⇒ Object
Creates a frame based on the given page’s box and margin.
The margin
can be any value allowed by HexaPDF::Layout::Style::Quad#set.
Note: This is a helper method for use inside the #template callable.
139 140 141 142 143 144 145 146 147 |
# File 'lib/hexapdf/layout/page_style.rb', line 139 def create_frame(page, margin = 36) box = page.box margin = Layout::Style::Quad.new(margin) Layout::Frame.new(box.left + margin.left, box.bottom + margin.bottom, box.width - margin.left - margin.right, box.height - margin.bottom - margin.top, context: page) end |
#create_page(document) ⇒ Object
Creates a new page in the given document using this page style and returns it.
If the #frame has not changed during execution of the #template, a default frame covering the whole page except a margin of 36 is assigned.
126 127 128 129 130 131 132 |
# File 'lib/hexapdf/layout/page_style.rb', line 126 def create_page(document) frame_before = @frame page = document.pages.create(media_box: page_size, orientation: orientation) template&.call(page.canvas, self) self.frame = create_frame(page, 36) if @frame.equal?(frame_before) page end |