Boxes
The HexaPDF::Layout::Box class is used as the basis for all document layout features.
This example shows the basic properties that are available for all boxes, like paddings, borders and and background color. It is also possible to use the underlay and overlay callbacks with boxes.
- Usage:
ruby boxes.rb
- Resulting PDF:
- boxes.pdf
- Preview:
Code
require 'hexapdf'
doc = HexaPDF::Document.new
annotate_box = lambda do |canvas, box|
text = ""
canvas.font("Times", size: 6).leading(7)
if (data = box.style.padding)
text << "Padding (TRBL): #{data.top}, #{data.right}, #{data.bottom}, #{data.left}\n"
end
unless box.style.border.none?
data = box.style.border.width
text << "Border Width (TRBL): #{data.top}, #{data.right}, #{data.bottom}, #{data.left}\n"
data = box.style.border.color
text << "Border Color (TRBL):\n* #{data.top}\n* #{data.right}\n* #{data.bottom}\n* #{data.left}\n"
data = box.style.border.style
text << "Border Style (TRBL):\n* #{data.top}\n* #{data.right}\n* #{data.bottom}\n* #{data.left}\n"
end
canvas.line_width(0.1).rectangle(0, 0, box.content_width, box.content_height).stroke
canvas.text(text, at: [0, box.content_height - 10])
end
canvas = doc.pages.add.canvas
[[1, "hp-blue-light"], [5, "hp-teal-light"],
[15, "hp-orange-light"]].each_with_index do |(width, color), row|
color = canvas.color_from_specification([color])
[:solid, :dashed, :dashed_round, :dotted].each_with_index do |style, column|
box = HexaPDF::Layout::Box.create(
width: 100, height: 100, content_box: true,
border: {width: width, style: style},
background_color: color.components.map {|c| c + 0.2 * column },
&annotate_box)
box.draw(canvas, 20 + 140 * column, 700 - 150 * row)
end
end
# The whole kitchen sink
box = HexaPDF::Layout::Box.create(
width: 470, height: 200, content_box: true,
padding: [20, 5, 10, 15],
border: {width: [20, 40, 30, 15],
color: ["hp-blue", "hp-orange", "hp-teal", "hp-blue-light"],
style: [:solid, :dashed, :dashed_round, :dotted]},
background_color: "hp-orange-light2",
underlays: [
lambda do |canv, _|
canv.stroke_color([255, 0, 0]).line_width(10).line_cap_style(:butt).
line(0, 0, box.width, box.height).line(0, box.height, box.width, 0).
stroke
end
],
overlays: [
lambda do |canv, _|
canv.stroke_color("hp-blue-dark").line_width(5).
rectangle(10, 10, box.width - 20, box.height - 20).stroke
end
],
&annotate_box)
box.draw(canvas, 20, 100)
doc.write("boxes.pdf", optimize: true)