Class: SilkLayout::Render::PdfRenderer
- Inherits:
-
Object
- Object
- SilkLayout::Render::PdfRenderer
- 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
- .normalize_page_size(page_size) ⇒ Object
- .page_dimensions(page_size:, page_width:, page_height:) ⇒ Object
- .px_to_pt(px) ⇒ Object
- .render(box_tree, output_path, page_size: nil, page_width: nil, page_height: nil) ⇒ Object
- .validate_dimension(value, name) ⇒ Object
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
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 |