thinreports 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +3 -3
- data/.github/workflows/test.yml +28 -36
- data/.gitignore +1 -1
- data/CHANGELOG.md +19 -1
- data/Gemfile +11 -0
- data/README.md +12 -17
- data/Rakefile +17 -11
- data/lib/thinreports/basic_report/core/errors.rb +62 -0
- data/lib/thinreports/basic_report/core/format/base.rb +91 -0
- data/lib/thinreports/basic_report/core/shape/base/interface.rb +42 -0
- data/lib/thinreports/basic_report/core/shape/base/internal.rb +53 -0
- data/lib/thinreports/basic_report/core/shape/basic/block_format.rb +15 -0
- data/lib/thinreports/basic_report/core/shape/basic/block_interface.rb +34 -0
- data/lib/thinreports/basic_report/core/shape/basic/block_internal.rb +36 -0
- data/lib/thinreports/basic_report/core/shape/basic/format.rb +24 -0
- data/lib/thinreports/basic_report/core/shape/basic/interface.rb +87 -0
- data/lib/thinreports/basic_report/core/shape/basic/internal.rb +28 -0
- data/lib/thinreports/{core → basic_report/core}/shape/basic.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/image_block/format.rb +14 -0
- data/lib/thinreports/basic_report/core/shape/image_block/interface.rb +25 -0
- data/lib/thinreports/basic_report/core/shape/image_block/internal.rb +19 -0
- data/lib/thinreports/{core → basic_report/core}/shape/image_block.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/list/format.rb +92 -0
- data/lib/thinreports/basic_report/core/shape/list/manager.rb +231 -0
- data/lib/thinreports/basic_report/core/shape/list/page.rb +112 -0
- data/lib/thinreports/basic_report/core/shape/list/page_state.rb +50 -0
- data/lib/thinreports/basic_report/core/shape/list/section_format.rb +37 -0
- data/lib/thinreports/basic_report/core/shape/list/section_interface.rb +51 -0
- data/lib/thinreports/basic_report/core/shape/list/section_internal.rb +33 -0
- data/lib/thinreports/{core → basic_report/core}/shape/list.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/manager/format.rb +33 -0
- data/lib/thinreports/basic_report/core/shape/manager/internal.rb +109 -0
- data/lib/thinreports/basic_report/core/shape/manager/target.rb +114 -0
- data/lib/thinreports/basic_report/core/shape/page_number/format.rb +32 -0
- data/lib/thinreports/basic_report/core/shape/page_number/interface.rb +31 -0
- data/lib/thinreports/basic_report/core/shape/page_number/internal.rb +57 -0
- data/lib/thinreports/{core → basic_report/core}/shape/page_number.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/stack_view/format.rb +29 -0
- data/lib/thinreports/basic_report/core/shape/stack_view/interface.rb +19 -0
- data/lib/thinreports/basic_report/core/shape/stack_view/internal.rb +24 -0
- data/lib/thinreports/basic_report/core/shape/stack_view/row_format.rb +41 -0
- data/lib/thinreports/{core → basic_report/core}/shape/stack_view.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/style/base.rb +149 -0
- data/lib/thinreports/basic_report/core/shape/style/basic.rb +24 -0
- data/lib/thinreports/basic_report/core/shape/style/graphic.rb +43 -0
- data/lib/thinreports/basic_report/core/shape/style/text.rb +122 -0
- data/lib/thinreports/basic_report/core/shape/text/format.rb +17 -0
- data/lib/thinreports/basic_report/core/shape/text/interface.rb +20 -0
- data/lib/thinreports/basic_report/core/shape/text/internal.rb +24 -0
- data/lib/thinreports/{core → basic_report/core}/shape/text.rb +6 -4
- data/lib/thinreports/basic_report/core/shape/text_block/format.rb +43 -0
- data/lib/thinreports/basic_report/core/shape/text_block/formatter/basic.rb +41 -0
- data/lib/thinreports/basic_report/core/shape/text_block/formatter/datetime.rb +25 -0
- data/lib/thinreports/basic_report/core/shape/text_block/formatter/number.rb +69 -0
- data/lib/thinreports/basic_report/core/shape/text_block/formatter/padding.rb +27 -0
- data/lib/thinreports/basic_report/core/shape/text_block/formatter.rb +38 -0
- data/lib/thinreports/basic_report/core/shape/text_block/interface.rb +37 -0
- data/lib/thinreports/basic_report/core/shape/text_block/internal.rb +75 -0
- data/lib/thinreports/{core → basic_report/core}/shape/text_block.rb +6 -4
- data/lib/thinreports/basic_report/core/shape.rb +44 -0
- data/lib/thinreports/basic_report/core/utils.rb +47 -0
- data/lib/thinreports/basic_report/generator/pdf/document/draw_shape.rb +108 -0
- data/lib/thinreports/basic_report/generator/pdf/document/draw_template_items.rb +71 -0
- data/lib/thinreports/basic_report/generator/pdf/document/font.rb +90 -0
- data/lib/thinreports/basic_report/generator/pdf/document/graphics/attributes.rb +149 -0
- data/lib/thinreports/basic_report/generator/pdf/document/graphics/basic.rb +137 -0
- data/lib/thinreports/basic_report/generator/pdf/document/graphics/image.rb +99 -0
- data/lib/thinreports/basic_report/generator/pdf/document/graphics/text.rb +180 -0
- data/lib/thinreports/basic_report/generator/pdf/document/graphics.rb +42 -0
- data/lib/thinreports/basic_report/generator/pdf/document/page.rb +96 -0
- data/lib/thinreports/basic_report/generator/pdf/document/parse_color.rb +51 -0
- data/lib/thinreports/basic_report/generator/pdf/document.rb +132 -0
- data/lib/thinreports/basic_report/generator/pdf/drawer/base.rb +50 -0
- data/lib/thinreports/basic_report/generator/pdf/drawer/list.rb +65 -0
- data/lib/thinreports/basic_report/generator/pdf/drawer/list_section.rb +51 -0
- data/lib/thinreports/basic_report/generator/pdf/drawer/page.rb +127 -0
- data/lib/thinreports/basic_report/generator/pdf/prawn_ext/calc_image_dimensions.rb +34 -0
- data/lib/thinreports/basic_report/generator/pdf/prawn_ext/width_of.rb +31 -0
- data/lib/thinreports/basic_report/generator/pdf.rb +66 -0
- data/lib/thinreports/basic_report/layout/base.rb +48 -0
- data/lib/thinreports/basic_report/layout/format.rb +67 -0
- data/lib/thinreports/basic_report/layout/legacy_schema.rb +383 -0
- data/lib/thinreports/basic_report/layout/version.rb +41 -0
- data/lib/thinreports/{layout.rb → basic_report/layout.rb} +6 -4
- data/lib/thinreports/basic_report/report/base.rb +173 -0
- data/lib/thinreports/basic_report/report/internal.rb +107 -0
- data/lib/thinreports/basic_report/report/page.rb +97 -0
- data/lib/thinreports/basic_report/report.rb +26 -0
- data/lib/thinreports/basic_report.rb +15 -0
- data/lib/thinreports/config.rb +1 -1
- data/lib/thinreports/section_report.rb +12 -0
- data/lib/thinreports/version.rb +1 -1
- data/lib/thinreports.rb +2 -13
- data/thinreports.gemspec +3 -7
- metadata +97 -154
- data/gemfiles/prawn-2.2.gemfile +0 -5
- data/gemfiles/prawn-2.3.gemfile +0 -5
- data/gemfiles/prawn-2.4.gemfile +0 -5
- data/lib/thinreports/core/errors.rb +0 -60
- data/lib/thinreports/core/format/base.rb +0 -89
- data/lib/thinreports/core/shape/base/interface.rb +0 -40
- data/lib/thinreports/core/shape/base/internal.rb +0 -51
- data/lib/thinreports/core/shape/basic/block_format.rb +0 -13
- data/lib/thinreports/core/shape/basic/block_interface.rb +0 -32
- data/lib/thinreports/core/shape/basic/block_internal.rb +0 -34
- data/lib/thinreports/core/shape/basic/format.rb +0 -22
- data/lib/thinreports/core/shape/basic/interface.rb +0 -85
- data/lib/thinreports/core/shape/basic/internal.rb +0 -26
- data/lib/thinreports/core/shape/image_block/format.rb +0 -12
- data/lib/thinreports/core/shape/image_block/interface.rb +0 -23
- data/lib/thinreports/core/shape/image_block/internal.rb +0 -17
- data/lib/thinreports/core/shape/list/format.rb +0 -90
- data/lib/thinreports/core/shape/list/manager.rb +0 -229
- data/lib/thinreports/core/shape/list/page.rb +0 -110
- data/lib/thinreports/core/shape/list/page_state.rb +0 -48
- data/lib/thinreports/core/shape/list/section_format.rb +0 -35
- data/lib/thinreports/core/shape/list/section_interface.rb +0 -49
- data/lib/thinreports/core/shape/list/section_internal.rb +0 -31
- data/lib/thinreports/core/shape/manager/format.rb +0 -31
- data/lib/thinreports/core/shape/manager/internal.rb +0 -107
- data/lib/thinreports/core/shape/manager/target.rb +0 -112
- data/lib/thinreports/core/shape/page_number/format.rb +0 -30
- data/lib/thinreports/core/shape/page_number/interface.rb +0 -29
- data/lib/thinreports/core/shape/page_number/internal.rb +0 -55
- data/lib/thinreports/core/shape/stack_view/format.rb +0 -27
- data/lib/thinreports/core/shape/stack_view/interface.rb +0 -17
- data/lib/thinreports/core/shape/stack_view/internal.rb +0 -22
- data/lib/thinreports/core/shape/stack_view/row_format.rb +0 -39
- data/lib/thinreports/core/shape/style/base.rb +0 -146
- data/lib/thinreports/core/shape/style/basic.rb +0 -22
- data/lib/thinreports/core/shape/style/graphic.rb +0 -41
- data/lib/thinreports/core/shape/style/text.rb +0 -120
- data/lib/thinreports/core/shape/text/format.rb +0 -15
- data/lib/thinreports/core/shape/text/interface.rb +0 -18
- data/lib/thinreports/core/shape/text/internal.rb +0 -22
- data/lib/thinreports/core/shape/text_block/format.rb +0 -41
- data/lib/thinreports/core/shape/text_block/formatter/basic.rb +0 -39
- data/lib/thinreports/core/shape/text_block/formatter/datetime.rb +0 -23
- data/lib/thinreports/core/shape/text_block/formatter/number.rb +0 -67
- data/lib/thinreports/core/shape/text_block/formatter/padding.rb +0 -25
- data/lib/thinreports/core/shape/text_block/formatter.rb +0 -34
- data/lib/thinreports/core/shape/text_block/interface.rb +0 -35
- data/lib/thinreports/core/shape/text_block/internal.rb +0 -73
- data/lib/thinreports/core/shape.rb +0 -42
- data/lib/thinreports/core/utils.rb +0 -45
- data/lib/thinreports/generate.rb +0 -11
- data/lib/thinreports/generator/pdf/document/draw_shape.rb +0 -106
- data/lib/thinreports/generator/pdf/document/draw_template_items.rb +0 -69
- data/lib/thinreports/generator/pdf/document/font.rb +0 -88
- data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +0 -147
- data/lib/thinreports/generator/pdf/document/graphics/basic.rb +0 -135
- data/lib/thinreports/generator/pdf/document/graphics/image.rb +0 -98
- data/lib/thinreports/generator/pdf/document/graphics/text.rb +0 -178
- data/lib/thinreports/generator/pdf/document/graphics.rb +0 -40
- data/lib/thinreports/generator/pdf/document/page.rb +0 -94
- data/lib/thinreports/generator/pdf/document/parse_color.rb +0 -49
- data/lib/thinreports/generator/pdf/document.rb +0 -130
- data/lib/thinreports/generator/pdf/drawer/base.rb +0 -48
- data/lib/thinreports/generator/pdf/drawer/list.rb +0 -63
- data/lib/thinreports/generator/pdf/drawer/list_section.rb +0 -49
- data/lib/thinreports/generator/pdf/drawer/page.rb +0 -125
- data/lib/thinreports/generator/pdf/prawn_ext/calc_image_dimensions.rb +0 -32
- data/lib/thinreports/generator/pdf/prawn_ext/width_of.rb +0 -29
- data/lib/thinreports/generator/pdf.rb +0 -63
- data/lib/thinreports/layout/base.rb +0 -46
- data/lib/thinreports/layout/format.rb +0 -65
- data/lib/thinreports/layout/legacy_schema.rb +0 -381
- data/lib/thinreports/layout/version.rb +0 -39
- data/lib/thinreports/report/base.rb +0 -169
- data/lib/thinreports/report/internal.rb +0 -105
- data/lib/thinreports/report/page.rb +0 -95
- data/lib/thinreports/report.rb +0 -24
- /data/lib/thinreports/{core → basic_report/core}/shape/base.rb +0 -0
- /data/lib/thinreports/{core → basic_report/core}/shape/manager.rb +0 -0
- /data/lib/thinreports/{core → basic_report/core}/shape/style.rb +0 -0
- /data/lib/thinreports/{generator → basic_report/generator}/pdf/prawn_ext.rb +0 -0
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module Page
|
|
7
|
-
JIS_SIZES = {
|
|
8
|
-
'B4' => [728.5, 1031.8],
|
|
9
|
-
'B5' => [515.9, 728.5]
|
|
10
|
-
}.freeze
|
|
11
|
-
|
|
12
|
-
# @param [Thinreports::Layout::Format] format
|
|
13
|
-
def start_new_page(format)
|
|
14
|
-
format_id =
|
|
15
|
-
if change_page_format?(format)
|
|
16
|
-
pdf.start_new_page(new_basic_page_options(format))
|
|
17
|
-
@current_page_format = format
|
|
18
|
-
|
|
19
|
-
create_format_stamp(format) unless format_stamp_registry.include?(format.identifier)
|
|
20
|
-
format.identifier
|
|
21
|
-
else
|
|
22
|
-
pdf.start_new_page(new_basic_page_options(current_page_format))
|
|
23
|
-
current_page_format.identifier
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
stamp(format_id.to_s)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def start_new_page_for_section_report(format)
|
|
30
|
-
@current_page_format = format
|
|
31
|
-
pdf.start_new_page(new_basic_page_options(current_page_format).merge(
|
|
32
|
-
top_margin: current_page_format.page_margin[0],
|
|
33
|
-
bottom_margin: current_page_format.page_margin[2]
|
|
34
|
-
))
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def max_content_height
|
|
38
|
-
pdf.margin_box.height
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def add_blank_page
|
|
42
|
-
pdf.start_new_page(pdf.page_count.zero? ? { size: 'A4' } : {})
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
private
|
|
46
|
-
|
|
47
|
-
# @return [Thinreports::Layout::Format]
|
|
48
|
-
attr_reader :current_page_format
|
|
49
|
-
|
|
50
|
-
# @param [Thinreports::Layout::Format] new_format
|
|
51
|
-
# @return [Boolean]
|
|
52
|
-
def change_page_format?(new_format)
|
|
53
|
-
!current_page_format ||
|
|
54
|
-
current_page_format.identifier != new_format.identifier
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @param [Thinreports::Layout::Format] format
|
|
58
|
-
def create_format_stamp(format)
|
|
59
|
-
create_stamp(format.identifier.to_s) do
|
|
60
|
-
draw_template_items(format.attributes['items'])
|
|
61
|
-
end
|
|
62
|
-
format_stamp_registry << format.identifier
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# @return [Array]
|
|
66
|
-
def format_stamp_registry
|
|
67
|
-
@format_stamp_registry ||= []
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
# @param [Thinreports::Layout::Format] format
|
|
71
|
-
# @return [Hash]
|
|
72
|
-
def new_basic_page_options(format)
|
|
73
|
-
options = { layout: format.page_orientation.to_sym }
|
|
74
|
-
|
|
75
|
-
options[:size] =
|
|
76
|
-
if format.user_paper_type?
|
|
77
|
-
[format.page_width.to_f, format.page_height.to_f]
|
|
78
|
-
else
|
|
79
|
-
case format.page_paper_type
|
|
80
|
-
# Convert B4(5)_ISO to B4(5)
|
|
81
|
-
when 'B4_ISO', 'B5_ISO'
|
|
82
|
-
format.page_paper_type.delete('_ISO')
|
|
83
|
-
when 'B4', 'B5'
|
|
84
|
-
JIS_SIZES[format.page_paper_type]
|
|
85
|
-
else
|
|
86
|
-
format.page_paper_type
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
options
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module ParseColor
|
|
7
|
-
# @param [String] color
|
|
8
|
-
# @return [String]
|
|
9
|
-
def parse_color(color)
|
|
10
|
-
color = color.downcase
|
|
11
|
-
|
|
12
|
-
if color =~ /^#?[\da-f]{6}$/
|
|
13
|
-
color.delete('#')
|
|
14
|
-
else
|
|
15
|
-
find_color_from_name(color)
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
private
|
|
20
|
-
|
|
21
|
-
# Supported only SAFE COLORS.
|
|
22
|
-
SUPPORTED_COLOR_NAMES = {
|
|
23
|
-
'red' => 'ff0000',
|
|
24
|
-
'yellow' => 'fff000',
|
|
25
|
-
'lime' => '00ff00',
|
|
26
|
-
'aqua' => '00ffff',
|
|
27
|
-
'blue' => '0000ff',
|
|
28
|
-
'fuchsia' => 'ff00ff',
|
|
29
|
-
'maroon' => '800000',
|
|
30
|
-
'olive' => '808000',
|
|
31
|
-
'green' => '008800',
|
|
32
|
-
'teal' => '008080',
|
|
33
|
-
'navy' => '000080',
|
|
34
|
-
'purple' => '800080',
|
|
35
|
-
'black' => '000000',
|
|
36
|
-
'gray' => '808080',
|
|
37
|
-
'silver' => 'c0c0c0',
|
|
38
|
-
'white' => 'ffffff'
|
|
39
|
-
}.freeze
|
|
40
|
-
|
|
41
|
-
def find_color_from_name(name)
|
|
42
|
-
color = SUPPORTED_COLOR_NAMES[name]
|
|
43
|
-
raise Thinreports::Errors::UnsupportedColorName, name unless color
|
|
44
|
-
color
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require_relative 'document/font'
|
|
4
|
-
require_relative 'document/parse_color'
|
|
5
|
-
require_relative 'document/graphics'
|
|
6
|
-
require_relative 'document/draw_shape'
|
|
7
|
-
require_relative 'document/draw_template_items'
|
|
8
|
-
require_relative 'document/page'
|
|
9
|
-
|
|
10
|
-
module Thinreports
|
|
11
|
-
module Generator
|
|
12
|
-
class PDF
|
|
13
|
-
class Document
|
|
14
|
-
include Utils
|
|
15
|
-
|
|
16
|
-
include PDF::Font
|
|
17
|
-
include PDF::ParseColor
|
|
18
|
-
include PDF::Graphics
|
|
19
|
-
include PDF::DrawShape
|
|
20
|
-
include PDF::DrawTemplateItems
|
|
21
|
-
include PDF::Page
|
|
22
|
-
|
|
23
|
-
# @return [Prawn::Document]
|
|
24
|
-
attr_reader :pdf
|
|
25
|
-
|
|
26
|
-
# @param [String] title (nil)
|
|
27
|
-
# @param [Hash] security (nil)
|
|
28
|
-
def initialize(title: nil, security: nil)
|
|
29
|
-
@pdf = Prawn::Document.new(
|
|
30
|
-
skip_page_creation: true,
|
|
31
|
-
margin: [0, 0],
|
|
32
|
-
info: {
|
|
33
|
-
CreationDate: Time.now,
|
|
34
|
-
Creator: 'Thinreports Generator for Ruby ' + Thinreports::VERSION,
|
|
35
|
-
Title: title
|
|
36
|
-
}
|
|
37
|
-
)
|
|
38
|
-
# Setup to Prawn::Document.
|
|
39
|
-
setup_fonts
|
|
40
|
-
setup_custom_graphic_states
|
|
41
|
-
|
|
42
|
-
# Encrypts the document.
|
|
43
|
-
@pdf.encrypt_document(security) if security
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# Delegate to Prawn::Document#render
|
|
47
|
-
# @see Prawn::Document#render
|
|
48
|
-
def render
|
|
49
|
-
result = pdf.render
|
|
50
|
-
finalize
|
|
51
|
-
result
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Delegate to Prawn::Document#render_file
|
|
55
|
-
# @see Prawn::Document#render_file
|
|
56
|
-
def render_file(*args)
|
|
57
|
-
finalize
|
|
58
|
-
pdf.render_file(*args)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
# @param [Numeric, String] x
|
|
62
|
-
# @param [Numeric, String] y
|
|
63
|
-
def translate(x, y, &block)
|
|
64
|
-
x, y = rpos(x, y)
|
|
65
|
-
pdf.translate(x, y, &block)
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
# @param [String] stamp_id
|
|
69
|
-
# @param [Array<Numeric>] at (nil)
|
|
70
|
-
def stamp(stamp_id, at = nil)
|
|
71
|
-
if at.nil?
|
|
72
|
-
pdf.stamp(stamp_id)
|
|
73
|
-
else
|
|
74
|
-
pdf.stamp_at(stamp_id, rpos(*at))
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Delegate to Prawn::Document#create_stamp
|
|
79
|
-
# @param [String] id
|
|
80
|
-
# @see Prawn::Document#create_stamp
|
|
81
|
-
def create_stamp(id, &block)
|
|
82
|
-
pdf.create_stamp(id, &block)
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
# @see #pdf
|
|
86
|
-
def internal
|
|
87
|
-
@pdf
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
private
|
|
91
|
-
|
|
92
|
-
def finalize
|
|
93
|
-
clean_temp_images
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
# @param [Array<String, Numeric>] values
|
|
97
|
-
# @return [Numeric, Array<Numeric>, nil]
|
|
98
|
-
def s2f(*values)
|
|
99
|
-
return nil if values.empty?
|
|
100
|
-
|
|
101
|
-
if values.size == 1
|
|
102
|
-
value = values.first
|
|
103
|
-
return nil unless value
|
|
104
|
-
value.is_a?(::Numeric) ? value : value.to_f
|
|
105
|
-
else
|
|
106
|
-
values.map { |v| s2f(v) }
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
# @param [Numeric, String] x
|
|
111
|
-
# @param [Numeric, String] y
|
|
112
|
-
# @return [Array<Float>]
|
|
113
|
-
def map_to_upper_left_relative_position(x, y)
|
|
114
|
-
x, y = s2f(x, y)
|
|
115
|
-
[x, -y]
|
|
116
|
-
end
|
|
117
|
-
alias rpos map_to_upper_left_relative_position
|
|
118
|
-
|
|
119
|
-
# @param [Numeric, String] x
|
|
120
|
-
# @param [Numeric, String] y
|
|
121
|
-
# @return [Array<Float>]
|
|
122
|
-
def map_to_upper_left_position(x, y)
|
|
123
|
-
x, y = s2f(x, y)
|
|
124
|
-
[x, pdf.bounds.height - y]
|
|
125
|
-
end
|
|
126
|
-
alias pos map_to_upper_left_position
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module Drawer
|
|
7
|
-
# @abstract
|
|
8
|
-
class Base
|
|
9
|
-
# @param [Thinreports::Generator::PDF::Document] pdf
|
|
10
|
-
# @param [Thinreports::Core::Shape::Manager::Format] format
|
|
11
|
-
def initialize(pdf, format)
|
|
12
|
-
@pdf = pdf
|
|
13
|
-
@format = format
|
|
14
|
-
@stamps = []
|
|
15
|
-
@draw_at = nil
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
# @abstract
|
|
19
|
-
def draw
|
|
20
|
-
raise NotImplementedError
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
private
|
|
24
|
-
|
|
25
|
-
# @param [Thinreports::Core::Shape::Base::Internal] shape
|
|
26
|
-
# @return [String]
|
|
27
|
-
def pdf_stamp_id(shape)
|
|
28
|
-
"#{@format.identifier}#{shape.identifier}"
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# @overload pdf_stamp(shape_id)
|
|
32
|
-
# @param [String] shape_id
|
|
33
|
-
# @overload pdf_stamp(shape)
|
|
34
|
-
# @param [Thinreports::Core::Shape::Base::Internal] shape
|
|
35
|
-
def pdf_stamp(shape)
|
|
36
|
-
shape = pdf_stamp_id(shape) unless shape.is_a?(::String)
|
|
37
|
-
@pdf.stamp(shape, @draw_at)
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# @param [Thinreports::Core::Shape::Base::Internal] shape
|
|
41
|
-
def create_pdf_stamp(shape, &block)
|
|
42
|
-
@pdf.create_stamp(pdf_stamp_id(shape), &block)
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module Drawer
|
|
7
|
-
class List < Base
|
|
8
|
-
# @param (see PDF::Drawer::Base#initialize)
|
|
9
|
-
def initialize(pdf, format)
|
|
10
|
-
super
|
|
11
|
-
@sections = {}
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# @param [Thinreports::Core::Shape::List::PageState] list_page
|
|
15
|
-
def draw(list_page)
|
|
16
|
-
draw_section(list_page.header) if list_page.header
|
|
17
|
-
list_page.rows.each do |row|
|
|
18
|
-
draw_section(row)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Returns Thinreports::Report::Page object
|
|
22
|
-
manager = list_page.parent.manager
|
|
23
|
-
|
|
24
|
-
list_id = list_page.id.to_s
|
|
25
|
-
manager.format.shapes.each do |id, shape|
|
|
26
|
-
next unless list_pageno?(list_id, shape)
|
|
27
|
-
|
|
28
|
-
shape = manager.final_shape(id)
|
|
29
|
-
@pdf.draw_shape_pageno(shape.internal,
|
|
30
|
-
list_page.no, list_page.manager.page_count)
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
# @param [String] list_id
|
|
37
|
-
# @param [Thinreports::Core::Shape::Base::Format] shape
|
|
38
|
-
# @return [Boolean]
|
|
39
|
-
def list_pageno?(list_id, shape)
|
|
40
|
-
shape.type == Thinreports::Core::Shape::PageNumber::TYPE_NAME &&
|
|
41
|
-
shape.target == list_id
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# @param [Thinreports::Core::Shape::List::SectionInterface] section
|
|
45
|
-
def draw_section(section)
|
|
46
|
-
internal = section.internal
|
|
47
|
-
|
|
48
|
-
base_top = @format.section_base_position_top(internal.section_name)
|
|
49
|
-
position = [internal.relative_left, base_top + internal.relative_top]
|
|
50
|
-
|
|
51
|
-
drawer(internal).draw(section, position)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# @param [Thinreports::Core::Shape::List::SectionInternal] section
|
|
55
|
-
# @return [Thinreports::Generator::PDF::Drawer::ListSection]
|
|
56
|
-
def drawer(section)
|
|
57
|
-
@sections[section.section_name] ||= ListSection.new(@pdf, section)
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module Drawer
|
|
7
|
-
class ListSection < Page
|
|
8
|
-
# @param pdf (see PDF::Drawer::Page#initialize)
|
|
9
|
-
# @param section [Thinreports::Core::Shape::List::SectionInternal] section
|
|
10
|
-
def initialize(pdf, section)
|
|
11
|
-
super(pdf, section.format)
|
|
12
|
-
@section = section
|
|
13
|
-
@stamp_created = false
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# @param [Thinreports::Core::Shape::List::SectionInternal] section
|
|
17
|
-
# @param [Array<Numeric>] at
|
|
18
|
-
def draw(section, at)
|
|
19
|
-
@draw_at = at
|
|
20
|
-
draw_section
|
|
21
|
-
super(section)
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
private
|
|
25
|
-
|
|
26
|
-
def draw_section
|
|
27
|
-
id = @format.identifier.to_s
|
|
28
|
-
|
|
29
|
-
unless @stamp_created
|
|
30
|
-
@pdf.create_stamp(id) { @pdf.draw_template_items(@format.attributes['items']) }
|
|
31
|
-
@stamp_created = true
|
|
32
|
-
end
|
|
33
|
-
pdf_stamp(id)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @see Thinreports::Generator::PDF::Drawer::Page#draw_tblock_shape
|
|
37
|
-
def draw_tblock_shape(shape)
|
|
38
|
-
@pdf.translate(*@draw_at) { super }
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
# @see Thinreports::Generator::PDF::Drawer::Page#draw_iblock_shape
|
|
42
|
-
def draw_iblock_shape(shape)
|
|
43
|
-
@pdf.translate(*@draw_at) { super }
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
class PDF
|
|
6
|
-
module Drawer
|
|
7
|
-
class Page < Base
|
|
8
|
-
# @param (see PDF::Drawer::Base#initialize)
|
|
9
|
-
def initialize(pdf, format)
|
|
10
|
-
super
|
|
11
|
-
@lists = {}
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# @param [Thinreports::Report::Page] page
|
|
15
|
-
def draw(page)
|
|
16
|
-
manager = page.manager
|
|
17
|
-
|
|
18
|
-
manager.format.shapes.each_key do |id|
|
|
19
|
-
shape = manager.final_shape(id)
|
|
20
|
-
next unless shape
|
|
21
|
-
|
|
22
|
-
shape = shape.internal
|
|
23
|
-
|
|
24
|
-
if shape.type_of?(Core::Shape::PageNumber::TYPE_NAME)
|
|
25
|
-
# Do not draw pageno if is not for Report
|
|
26
|
-
draw_pageno_shape(shape, page) if page.count? && shape.for_report?
|
|
27
|
-
else
|
|
28
|
-
draw_shape(shape)
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
private
|
|
34
|
-
|
|
35
|
-
def draw_shape(shape)
|
|
36
|
-
if shape.type_of?(Core::Shape::TextBlock::TYPE_NAME)
|
|
37
|
-
draw_tblock_shape(shape)
|
|
38
|
-
elsif shape.type_of?(Core::Shape::List::TYPE_NAME)
|
|
39
|
-
draw_list_shape(shape)
|
|
40
|
-
elsif shape.type_of?(Core::Shape::ImageBlock::TYPE_NAME)
|
|
41
|
-
draw_iblock_shape(shape)
|
|
42
|
-
else
|
|
43
|
-
id = shape.identifier
|
|
44
|
-
unless @stamps.include?(id)
|
|
45
|
-
create_basic_shape_stamp(shape)
|
|
46
|
-
@stamps << id
|
|
47
|
-
end
|
|
48
|
-
pdf_stamp(shape)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def draw_pageno_shape(shape, page)
|
|
53
|
-
@pdf.draw_shape_pageno(shape, page.no, page.report.page_count)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @see #draw_shape
|
|
57
|
-
def draw_list_shape(shape)
|
|
58
|
-
drawer = @lists[shape.id] ||= List.new(@pdf, shape.format)
|
|
59
|
-
drawer.draw(shape)
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
# @see #draw_shape
|
|
63
|
-
def draw_tblock_shape(shape)
|
|
64
|
-
@pdf.draw_shape_tblock(shape)
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
# @see #draw_shape
|
|
68
|
-
def draw_iblock_shape(shape)
|
|
69
|
-
@pdf.draw_shape_iblock(shape)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
# @param [Thinreports::Core::Shape::Base::Internal] shape
|
|
73
|
-
def create_basic_shape_stamp(shape)
|
|
74
|
-
if shape.type_of?('text')
|
|
75
|
-
create_text_stamp(shape)
|
|
76
|
-
elsif shape.type_of?('image')
|
|
77
|
-
create_image_stamp(shape)
|
|
78
|
-
elsif shape.type_of?('ellipse')
|
|
79
|
-
create_ellipse_stamp(shape)
|
|
80
|
-
elsif shape.type_of?('rect')
|
|
81
|
-
create_rect_stamp(shape)
|
|
82
|
-
elsif shape.type_of?('line')
|
|
83
|
-
create_line_stamp(shape)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# @see #create_basic_shape_stamp
|
|
88
|
-
def create_image_stamp(shape)
|
|
89
|
-
create_pdf_stamp(shape) do
|
|
90
|
-
@pdf.draw_shape_image(shape)
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
# @see #create_basic_shape_stamp
|
|
95
|
-
def create_rect_stamp(shape)
|
|
96
|
-
create_pdf_stamp(shape) do
|
|
97
|
-
@pdf.draw_shape_rect(shape)
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
# @see #create_basic_shape_stamp
|
|
102
|
-
def create_ellipse_stamp(shape)
|
|
103
|
-
create_pdf_stamp(shape) do
|
|
104
|
-
@pdf.draw_shape_ellipse(shape)
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
# @see #create_basic_shape_stamp
|
|
109
|
-
def create_line_stamp(shape)
|
|
110
|
-
create_pdf_stamp(shape) do
|
|
111
|
-
@pdf.draw_shape_line(shape)
|
|
112
|
-
end
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
# @see #create_basic_shape_stamp
|
|
116
|
-
def create_text_stamp(shape)
|
|
117
|
-
create_pdf_stamp(shape) do
|
|
118
|
-
@pdf.draw_shape_text(shape)
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
module PrawnExt
|
|
6
|
-
module CalcImageDimensions
|
|
7
|
-
# Implement :auto_fit option for image size calculation.
|
|
8
|
-
#
|
|
9
|
-
# When the image is larger than the box, the original: fit option does not change
|
|
10
|
-
# the image size. The :auto_fit option changes the image size to fit in the box
|
|
11
|
-
# while maintaining the aspect ratio.
|
|
12
|
-
#
|
|
13
|
-
# Usage:
|
|
14
|
-
# image '/path/to/image.png', at: [100, 100], auto_fit: [100, 100]
|
|
15
|
-
#
|
|
16
|
-
def calc_image_dimensions(options)
|
|
17
|
-
if options[:auto_fit]
|
|
18
|
-
image_width = options[:width] || width
|
|
19
|
-
image_height = options[:height] || height
|
|
20
|
-
|
|
21
|
-
box_width, box_height = options.delete(:auto_fit)
|
|
22
|
-
|
|
23
|
-
options[:fit] = [box_width, box_height] if image_width > box_width || image_height > box_height
|
|
24
|
-
end
|
|
25
|
-
super(options)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
Prawn::Images::Image.prepend Thinreports::Generator::PrawnExt::CalcImageDimensions
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Thinreports
|
|
4
|
-
module Generator
|
|
5
|
-
module PrawnExt
|
|
6
|
-
module WidthOf
|
|
7
|
-
# This patch fixes the character_spacing effect on text width calculation.
|
|
8
|
-
#
|
|
9
|
-
# The original #width_of:
|
|
10
|
-
#
|
|
11
|
-
# width_of('abcd') #=> 4 + 4 = 8
|
|
12
|
-
#
|
|
13
|
-
# The #width_of in this patch:
|
|
14
|
-
#
|
|
15
|
-
# width_of('abcd') #=> 4 + 3 = 7
|
|
16
|
-
#
|
|
17
|
-
def width_of(*)
|
|
18
|
-
width = super - character_spacing
|
|
19
|
-
width > 0 ? width : 0
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# Prawn v2.3 and later includes this patch by https://github.com/prawnpdf/prawn/pull/1117.
|
|
27
|
-
if Prawn::VERSION < '2.3.0'
|
|
28
|
-
Prawn::Document.prepend Thinreports::Generator::PrawnExt::WidthOf
|
|
29
|
-
end
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'prawn'
|
|
4
|
-
|
|
5
|
-
module Thinreports
|
|
6
|
-
module Generator
|
|
7
|
-
class PDF
|
|
8
|
-
# @return [Thinreports::Report::Base]
|
|
9
|
-
attr_reader :report
|
|
10
|
-
|
|
11
|
-
# @param [Thinreports::Report::Base] report
|
|
12
|
-
# @param [Hash] security (nil)
|
|
13
|
-
def initialize(report, security: nil)
|
|
14
|
-
report.finalize
|
|
15
|
-
|
|
16
|
-
@report = report.internal
|
|
17
|
-
title = default_layout ? default_layout.format.report_title : nil
|
|
18
|
-
|
|
19
|
-
@document = Document.new(title: title, security: security)
|
|
20
|
-
@drawers = {}
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# @param [String, nil] filename
|
|
24
|
-
# @return [String, nil]
|
|
25
|
-
def generate(filename = nil)
|
|
26
|
-
draw_report
|
|
27
|
-
filename ? @document.render_file(filename) : @document.render
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def default_layout
|
|
31
|
-
report.default_layout
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
private
|
|
35
|
-
|
|
36
|
-
def draw_report
|
|
37
|
-
report.pages.each do |page|
|
|
38
|
-
draw_page(page)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def draw_page(page)
|
|
43
|
-
return @document.add_blank_page if page.blank?
|
|
44
|
-
|
|
45
|
-
format = page.layout.format
|
|
46
|
-
@document.start_new_page(format)
|
|
47
|
-
|
|
48
|
-
drawer(format).draw(page)
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def drawer(format)
|
|
52
|
-
@drawers[format.identifier] ||= Drawer::Page.new(@document, format)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
require_relative 'pdf/prawn_ext'
|
|
59
|
-
require_relative 'pdf/document'
|
|
60
|
-
require_relative 'pdf/drawer/base'
|
|
61
|
-
require_relative 'pdf/drawer/page'
|
|
62
|
-
require_relative 'pdf/drawer/list'
|
|
63
|
-
require_relative 'pdf/drawer/list_section'
|