Class: SilkLayout::Render::PdfRenderer

Inherits:
Object
  • Object
show all
Defined in:
lib/silk_layout/render/pdf_renderer.rb

Constant Summary collapse

CSS_DPI =
96.0
PDF_DPI =
72.0
DEFAULT_PAGE_WIDTH =
800
DEFAULT_PAGE_HEIGHT =
1000

Class Method Summary collapse

Class Method Details

.normalize_page_size(page_size) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/silk_layout/render/pdf_renderer.rb', line 45

def self.normalize_page_size(page_size)
  case page_size
  when Array
    raise ArgumentError, "page_size must contain width and height" unless page_size.length == 2

    page_size
  when Hash
    [page_size[:width] || page_size["width"], page_size[:height] || page_size["height"]]
  else
    raise ArgumentError, "page_size must be an Array or Hash"
  end
end

.page_dimensions(page_size:, page_width:, page_height:) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/silk_layout/render/pdf_renderer.rb', line 36

def self.page_dimensions(page_size:, page_width:, page_height:)
  width, height = page_size ? normalize_page_size(page_size) : [DEFAULT_PAGE_WIDTH, DEFAULT_PAGE_HEIGHT]

  [
    validate_dimension(page_width || width || DEFAULT_PAGE_WIDTH, "page_width"),
    validate_dimension(page_height || height || DEFAULT_PAGE_HEIGHT, "page_height")
  ]
end

.px_to_pt(px) ⇒ Object



32
33
34
# File 'lib/silk_layout/render/pdf_renderer.rb', line 32

def self.px_to_pt(px)
  px * PDF_DPI / CSS_DPI
end

.render(box_tree, output_path, page_size: nil, page_width: nil, page_height: nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/silk_layout/render/pdf_renderer.rb', line 14

def self.render(box_tree, output_path, page_size: nil, page_width: nil, page_height: nil)
  doc = HexaPDF::Document.new

  resolved_page_width, resolved_page_height = page_dimensions(
    page_size: page_size,
    page_width: page_width,
    page_height: page_height
  )

  page_width_pt = px_to_pt(resolved_page_width)
  page_height_pt = px_to_pt(resolved_page_height)

  page = doc.pages.add([0, 0, page_width_pt, page_height_pt])
  Painter.paint(page.canvas, box_tree, page_height_pt)

  doc.write(output_path)
end

.validate_dimension(value, name) ⇒ Object

Raises:

  • (ArgumentError)


58
59
60
61
62
# File 'lib/silk_layout/render/pdf_renderer.rb', line 58

def self.validate_dimension(value, name)
  return value if value.is_a?(Numeric) && value.positive?

  raise ArgumentError, "#{name} must be a positive number of CSS pixels"
end