thinreports 0.7.6 → 0.7.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +11 -1
  4. data/Gemfile +2 -9
  5. data/MIT-LICENSE +1 -1
  6. data/README.rdoc +25 -26
  7. data/lib/thinreports/core/format/base.rb +0 -5
  8. data/lib/thinreports/core/format/builder.rb +5 -5
  9. data/lib/thinreports/core/page.rb +5 -3
  10. data/lib/thinreports/core/shape.rb +2 -0
  11. data/lib/thinreports/core/shape/basic/internal.rb +5 -1
  12. data/lib/thinreports/core/shape/list/configuration.rb +9 -3
  13. data/lib/thinreports/core/shape/list/manager.rb +11 -4
  14. data/lib/thinreports/core/shape/list/page.rb +3 -1
  15. data/lib/thinreports/core/shape/list/page_state.rb +4 -1
  16. data/lib/thinreports/core/shape/manager/internal.rb +1 -1
  17. data/lib/thinreports/core/shape/page_number.rb +15 -0
  18. data/lib/thinreports/core/shape/page_number/format.rb +25 -0
  19. data/lib/thinreports/core/shape/page_number/interface.rb +27 -0
  20. data/lib/thinreports/core/shape/page_number/internal.rb +57 -0
  21. data/lib/thinreports/core/shape/style/text.rb +6 -2
  22. data/lib/thinreports/core/shape/text_block/format.rb +1 -0
  23. data/lib/thinreports/generator/pdf.rb +1 -1
  24. data/lib/thinreports/generator/pdf/document/draw_shape.rb +14 -4
  25. data/lib/thinreports/generator/pdf/document/graphics/attributes.rb +9 -0
  26. data/lib/thinreports/generator/pdf/document/graphics/text.rb +4 -1
  27. data/lib/thinreports/generator/pdf/document/page.rb +18 -3
  28. data/lib/thinreports/generator/pdf/drawer/base.rb +3 -8
  29. data/lib/thinreports/generator/pdf/drawer/list.rb +31 -12
  30. data/lib/thinreports/generator/pdf/drawer/list_section.rb +5 -5
  31. data/lib/thinreports/generator/pdf/drawer/page.rb +22 -10
  32. data/lib/thinreports/generator/pdf/prawn_ext.rb +18 -1
  33. data/lib/thinreports/layout/base.rb +4 -2
  34. data/lib/thinreports/layout/format.rb +1 -5
  35. data/lib/thinreports/report/base.rb +36 -6
  36. data/lib/thinreports/report/internal.rb +7 -5
  37. data/lib/thinreports/version.rb +1 -1
  38. data/tasks/doc.rake +0 -1
  39. data/test/case/character_spacing/character_spacing.rb +4 -3
  40. data/test/case/dynamic_image/dynamic_image.rb +34 -34
  41. data/test/case/dynamic_style/dynamic_style.rb +141 -141
  42. data/test/case/eudc/eudc.rb +16 -16
  43. data/test/case/helper.rb +39 -20
  44. data/test/case/hidden_shapes/hidden_shapes.rb +4 -8
  45. data/test/case/list_events/list_events.rb +26 -26
  46. data/test/case/list_manual_generation/list_manual_generation.rb +16 -16
  47. data/test/case/list_page_number/list_page_number.rb +17 -0
  48. data/test/case/list_page_number/list_page_number.tlf +1 -0
  49. data/test/case/page_number/page_number.rb +33 -0
  50. data/test/case/page_number/page_number.tlf +1 -0
  51. data/test/case/password_setting/password_setting.rb +10 -0
  52. data/test/case/password_setting/password_setting.tlf +1 -0
  53. data/test/case/single_line_tblock/single_line_tblock.rb +10 -12
  54. data/test/case/tblock_overflow/tblock_overflow.rb +16 -16
  55. data/test/case/tblock_styles/tblock_styles.rb +24 -24
  56. data/test/case/text_align/text_align.rb +5 -6
  57. data/test/case/typeB_page_size/B4_ISO.tlf +1 -0
  58. data/test/case/typeB_page_size/B4_JIS.tlf +1 -0
  59. data/test/case/typeB_page_size/typeB_page_size.rb +17 -0
  60. data/test/case/word_wrap/word_wrap.rb +26 -0
  61. data/test/case/word_wrap/word_wrap.tlf +1 -0
  62. data/test/unit/core/format/test_builder.rb +1 -2
  63. data/test/unit/core/shape/basic/test_internal.rb +9 -1
  64. data/test/unit/core/shape/list/test_configuration.rb +6 -1
  65. data/test/unit/core/shape/list/test_manager.rb +10 -0
  66. data/test/unit/core/shape/list/test_page_state.rb +1 -1
  67. data/test/unit/core/shape/page_number/test_format.rb +73 -0
  68. data/test/unit/core/shape/page_number/test_interface.rb +30 -0
  69. data/test/unit/core/shape/page_number/test_internal.rb +81 -0
  70. data/test/unit/core/shape/styles/test_text.rb +12 -1
  71. data/test/unit/core/shape/text_block/formatter/test_datetime.rb +19 -17
  72. data/test/unit/core/shape/text_block/test_format.rb +5 -0
  73. data/test/unit/core/test_events.rb +5 -3
  74. data/test/unit/core/test_shape.rb +5 -1
  75. data/test/unit/generator/pdf/document/graphics/test_attributes.rb +6 -0
  76. data/test/unit/generator/pdf/document/test_draw_shape.rb +6 -0
  77. data/test/unit/generator/pdf/document/test_page.rb +29 -3
  78. data/test/unit/generator/test_pdf.rb +1 -10
  79. data/test/unit/helper.rb +33 -11
  80. data/test/unit/layout/test_base.rb +1 -1
  81. data/test/unit/report/test_base.rb +47 -0
  82. data/test/unit/report/test_internal.rb +22 -0
  83. data/test/unit/tmp/.gitkeep +0 -0
  84. data/thinreports.gemspec +14 -13
  85. metadata +89 -53
  86. data/.yardopts +0 -1
  87. data/test/case/list_header_inheriting/list_header_inheriting.rb +0 -17
  88. data/test/case/list_header_inheriting/list_header_inheriting.tlf +0 -1
@@ -68,17 +68,19 @@ module ThinReports
68
68
  @finalized
69
69
  end
70
70
 
71
- def load_layout(layout)
72
- return @default_layout if layout.nil?
71
+ def load_layout(id_or_filename)
72
+ return @default_layout if id_or_filename.nil?
73
73
 
74
- case layout
74
+ layout = case id_or_filename
75
75
  when Symbol
76
- layout_registry[layout]
76
+ layout_registry[id_or_filename]
77
77
  when String
78
- prepare_layout(layout)
78
+ prepare_layout(id_or_filename)
79
79
  else
80
80
  raise ArgumentError, 'Invalid argument for layout.'
81
81
  end
82
+ @default_layout = layout unless @default_layout
83
+ layout
82
84
  end
83
85
 
84
86
  private
@@ -2,5 +2,5 @@
2
2
 
3
3
  module ThinReports
4
4
  # The current version.
5
- VERSION = '0.7.6'
5
+ VERSION = '0.7.7'
6
6
  end
@@ -5,7 +5,6 @@ require 'yard'
5
5
  YARD::Rake::YardocTask.new(:doc) do |yard|
6
6
  yard.files = Dir['lib/**/*.rb']
7
7
  yard.options = [
8
- '--no-private',
9
8
  '--readme', 'README.rdoc',
10
9
  '--output-dir', 'doc/yardoc',
11
10
  '--template-path', 'doc/yardoc_templates'
@@ -1,7 +1,8 @@
1
1
  # coding: utf-8
2
2
 
3
- CaseRunner.current :character_spacing
3
+ testcase :character_spacing, 'Sets the character spacing in the Editor' do
4
+ report = ThinReports::Report.new :layout => layout_filename
5
+ report.start_new_page
4
6
 
5
- ThinReports::Report.generate_file(CaseRunner.output_file, :layout => CaseRunner.layout_file) do
6
- start_new_page
7
+ report.generate :filename => output_filename
7
8
  end
@@ -2,40 +2,40 @@
2
2
 
3
3
  require 'open-uri'
4
4
 
5
- CaseRunner.current :dynamic_image
6
-
7
- image50x50 = CaseRunner.case_resource('img50x50.png')
8
- image200x100 = CaseRunner.case_resource('img200x100.png')
9
- matsukei_logo = open('http://www.matsukei.co.jp/common/image/logo.jpg')
10
-
11
- ThinReports::Report.generate_file(:pdf, CaseRunner.output_file) do |r|
12
- r.use_layout(CaseRunner.layout_file)
13
-
14
- r.start_new_page
15
-
16
- r.page.values(:pos_top_left => image50x50,
17
- :pos_top_center => image50x50,
18
- :pos_top_right => image50x50,
19
- :pos_center_left => image50x50,
20
- :pos_center_center => image50x50,
21
- :pos_center_right => image50x50,
22
- :pos_bottom_left => image50x50,
23
- :pos_bottom_center => image50x50,
24
- :pos_bottom_right => image50x50)
25
-
26
- r.page.item(:overflow).src(image200x100)
27
-
28
- # It cannot do as follows:
29
- #
30
- # r.page.item(:logo1).src(matsukei_logo)
31
- # r.page.item(:logo2).value(matsukei_logo)
32
- #
33
- r.page.item(:logo1).src(matsukei_logo.path)
34
- r.page.item(:logo2).value(matsukei_logo.path)
35
-
36
- r.page.item(:thinreports_logo).src(open('http://www.thinreports.org/media/i/logo.png'))
5
+ testcase :dynamic_image, 'Show images dynamically' do
6
+ image50x50 = resource('img50x50.png')
7
+ image200x100 = resource('img200x100.png')
8
+ matsukei_logo = open('http://www.matsukei.co.jp/common/image/logo.jpg')
37
9
 
38
- r.page.list(:list) do |list|
39
- 3.times { list.add_row :in_list => image50x50 }
10
+ ThinReports::Report.generate :filename => output_filename do |r|
11
+ r.use_layout(layout_filename)
12
+
13
+ r.start_new_page
14
+
15
+ r.page.values(:pos_top_left => image50x50,
16
+ :pos_top_center => image50x50,
17
+ :pos_top_right => image50x50,
18
+ :pos_center_left => image50x50,
19
+ :pos_center_center => image50x50,
20
+ :pos_center_right => image50x50,
21
+ :pos_bottom_left => image50x50,
22
+ :pos_bottom_center => image50x50,
23
+ :pos_bottom_right => image50x50)
24
+
25
+ r.page.item(:overflow).src(image200x100)
26
+
27
+ # It cannot do as follows:
28
+ #
29
+ # r.page.item(:logo1).src(matsukei_logo)
30
+ # r.page.item(:logo2).value(matsukei_logo)
31
+ #
32
+ r.page.item(:logo1).src(matsukei_logo.path)
33
+ r.page.item(:logo2).value(matsukei_logo.path)
34
+
35
+ r.page.item(:thinreports_logo).src(open('http://www.thinreports.org/assets/images/thinreports-logo.png'))
36
+
37
+ r.page.list(:list) do |list|
38
+ 3.times { list.add_row :in_list => image50x50 }
39
+ end
40
40
  end
41
41
  end
@@ -1,154 +1,154 @@
1
1
  # coding: utf-8
2
2
 
3
- CaseRunner.current :dynamic_style
4
-
5
- image = CaseRunner.case_resource('image.png')
6
- setup_values = Proc.new do |page|
7
- # The Basic Style
8
- page.values(:basic_show5 => 'TextBlock',
9
- :basic_show6 => image,
10
- :basic_hide5 => 'TextBlock',
11
- :basic_hide6 => image)
12
- # The Text Style
13
- page.values(:text_b3 => 'To bold',
14
- :text_b4 => 'To normal',
15
- :text_i3 => 'To italic',
16
- :text_i4 => 'To normal',
17
- :text_u3 => 'To underline',
18
- :text_u4 => 'To none',
19
- :text_l3 => 'To line-through',
20
- :text_l4 => 'To none')
21
- page.values(:text_a2 => 'To right align',
22
- :text_a3 => "To right align\n右寄せ",
23
- :text_va2 => "To bottom align\n下揃え",
24
- :text_color2 => '赤色')
25
- end
26
-
27
- ThinReports::Report.generate_file(CaseRunner.output_file,
28
- :layout => CaseRunner.layout_file) do |r|
29
- # In case of using "dynamic_style.tlf"
30
-
31
- # Create raw-page.
32
- r.start_new_page
33
- r.page.item(:title).value('Original Page')
34
-
35
- setup_values.call(r.page)
36
-
37
- # Create styled-page.
38
- r.start_new_page
39
-
40
- setup_values.call(r.page)
41
- r.page.item(:title).value('Styled Page')
42
-
43
- # The Basic Style
44
- 6.times do |i|
45
- r.page.item("basic_show#{i + 1}").style(:visible, true)
46
- r.page.item("basic_hide#{i + 1}").style(:visible, false)
47
- end
48
-
49
- # The Graphic Style
50
- r.page.item(:graphic_bcolor1).style(:border_color, '#ff0000')
51
- r.page.item(:graphic_bcolor2).style(:border_color, 'red')
52
- # [WARNING] :stroke is deprecated.
53
- r.page.item(:graphic_bcolor3).style(:stroke, 'ff0000')
54
- # nil or 'none'.
55
- r.page.item(:graphic_bcolor4).style(:border_color, nil)
56
-
57
- r.page.item(:graphic_bwidth1).style(:border_width, 5)
58
- r.page.item(:graphic_bwidth2).style(:border_width, 5)
59
- r.page.item(:graphic_bwidth3).style(:border_width, 5)
60
- r.page.item(:graphic_bwidth4).style(:border_width, 2)
61
- r.page.item(:graphic_bwidth5).style(:border_width, 0)
62
-
63
- r.page.item(:graphic_fcolor1).style(:fill_color, '#ff0000')
64
- # [WARNING] :fill is deprecated.
65
- r.page.item(:graphic_fcolor2).style(:fill, 'red')
66
- # nil or 'none'
67
- r.page.item(:graphic_fcolor3).style(:fill_color, 'none')
68
- r.page.item(:graphic_fcolor4).style(:fill_color, 'ff0000')
69
-
70
- # The Text Style
71
- [1, 3].each do |i|
72
- r.page.item("text_b#{i}").style(:bold, true)
73
- r.page.item("text_i#{i}").style(:italic, true)
74
- r.page.item("text_u#{i}").style(:underline, true)
75
- r.page.item("text_l#{i}").style(:linethrough, true)
76
- end
77
- [2, 4].each do |i|
78
- r.page.item("text_b#{i}").style(:bold, false)
79
- r.page.item("text_i#{i}").style(:italic, false)
80
- r.page.item("text_u#{i}").style(:underline, false)
81
- r.page.item("text_l#{i}").style(:linethrough, false)
82
- end
83
-
84
- 3.times do |i|
85
- r.page.item("text_a#{i + 1}").style(:align, :right)
86
- end
87
- 2.times do |i|
88
- r.page.item("text_va#{i + 1}").style(:valign, :bottom)
89
- end
90
-
91
- 2.times do |i|
92
- r.page.item("text_color#{i + 1}").style(:color, 'ff0000')
93
- end
94
-
95
- # In case of using "dynamic_style_in_list.tlf"
96
- r.start_new_page(:layout => CaseRunner.case_resource('dynamic_style_in_list.tlf'))
97
-
98
- # Settings for Header.
99
- r.page.list(:list).header do |header|
100
- header.item(:rect).styles(:border_color => nil,
101
- :fill_color => 'ff00ff')
102
- header.item(:text).styles(:align => :center,
103
- :valign => :center,
104
- :bold => true)
105
- header.item(:tblock).styles(:align => :center,
106
- :valign => :center,
107
- :color => 'red',
108
- :linethrough => true)
3
+ testcase :dynamic_style, 'Change styles of the object dynamically' do |t|
4
+ image = t.resource('image.png')
5
+ setup_values = Proc.new do |page|
6
+ # The Basic Style
7
+ page.values(:basic_show5 => 'TextBlock',
8
+ :basic_show6 => image,
9
+ :basic_hide5 => 'TextBlock',
10
+ :basic_hide6 => image)
11
+ # The Text Style
12
+ page.values(:text_b3 => 'To bold',
13
+ :text_b4 => 'To normal',
14
+ :text_i3 => 'To italic',
15
+ :text_i4 => 'To normal',
16
+ :text_u3 => 'To underline',
17
+ :text_u4 => 'To none',
18
+ :text_l3 => 'To line-through',
19
+ :text_l4 => 'To none')
20
+ page.values(:text_a2 => 'To right align',
21
+ :text_a3 => "To right align\n右寄せ",
22
+ :text_va2 => "To bottom align\n下揃え",
23
+ :text_color2 => '赤色')
109
24
  end
110
25
 
111
- 1.step(10, 1) do |i|
112
- # Flag of overflowed list-page.
113
- is_overflowed = r.page.list(:list).overflow?
26
+ ThinReports::Report.generate(:filename => t.output_filename,
27
+ :layout => t.layout_filename) do |r|
28
+ # In case of using dynamic_style.tlf
114
29
 
115
- # Add details.
116
- r.page.list(:list).add_row do |row|
117
- case
118
- when i % 2 == 0
119
- row.item(:rect).styles(:border_color => 'ff0000',
120
- :border_width => 3,
121
- :fill_color => '0000ff')
122
- row.item(:text).styles(:color => 'red',
123
- :align => :left,
124
- :valign => :center)
125
- row.item(:tblock).styles(:color => 'blue',
30
+ # Create raw-page.
31
+ r.start_new_page
32
+ r.page.item(:title).value('Original Page')
33
+
34
+ setup_values.call(r.page)
35
+
36
+ # Create styled-page.
37
+ r.start_new_page
38
+
39
+ setup_values.call(r.page)
40
+ r.page.item(:title).value('Styled Page')
41
+
42
+ # The Basic Style
43
+ 6.times do |i|
44
+ r.page.item("basic_show#{i + 1}").style(:visible, true)
45
+ r.page.item("basic_hide#{i + 1}").style(:visible, false)
46
+ end
47
+
48
+ # The Graphic Style
49
+ r.page.item(:graphic_bcolor1).style(:border_color, '#ff0000')
50
+ r.page.item(:graphic_bcolor2).style(:border_color, 'red')
51
+ # [WARNING] :stroke is deprecated.
52
+ r.page.item(:graphic_bcolor3).style(:stroke, 'ff0000')
53
+ # nil or 'none'.
54
+ r.page.item(:graphic_bcolor4).style(:border_color, nil)
55
+
56
+ r.page.item(:graphic_bwidth1).style(:border_width, 5)
57
+ r.page.item(:graphic_bwidth2).style(:border_width, 5)
58
+ r.page.item(:graphic_bwidth3).style(:border_width, 5)
59
+ r.page.item(:graphic_bwidth4).style(:border_width, 2)
60
+ r.page.item(:graphic_bwidth5).style(:border_width, 0)
61
+
62
+ r.page.item(:graphic_fcolor1).style(:fill_color, '#ff0000')
63
+ # [WARNING] :fill is deprecated.
64
+ r.page.item(:graphic_fcolor2).style(:fill, 'red')
65
+ # nil or 'none'
66
+ r.page.item(:graphic_fcolor3).style(:fill_color, 'none')
67
+ r.page.item(:graphic_fcolor4).style(:fill_color, 'ff0000')
68
+
69
+ # The Text Style
70
+ [1, 3].each do |i|
71
+ r.page.item("text_b#{i}").style(:bold, true)
72
+ r.page.item("text_i#{i}").style(:italic, true)
73
+ r.page.item("text_u#{i}").style(:underline, true)
74
+ r.page.item("text_l#{i}").style(:linethrough, true)
75
+ end
76
+ [2, 4].each do |i|
77
+ r.page.item("text_b#{i}").style(:bold, false)
78
+ r.page.item("text_i#{i}").style(:italic, false)
79
+ r.page.item("text_u#{i}").style(:underline, false)
80
+ r.page.item("text_l#{i}").style(:linethrough, false)
81
+ end
82
+
83
+ 3.times do |i|
84
+ r.page.item("text_a#{i + 1}").style(:align, :right)
85
+ end
86
+ 2.times do |i|
87
+ r.page.item("text_va#{i + 1}").style(:valign, :bottom)
88
+ end
89
+
90
+ 2.times do |i|
91
+ r.page.item("text_color#{i + 1}").style(:color, 'ff0000')
92
+ end
93
+
94
+ # In case of using "dynamic_style_in_list.tlf"
95
+ r.start_new_page(:layout => t.resource('dynamic_style_in_list.tlf'))
96
+
97
+ # Settings for Header.
98
+ r.page.list(:list).header do |header|
99
+ header.item(:rect).styles(:border_color => nil,
100
+ :fill_color => 'ff00ff')
101
+ header.item(:text).styles(:align => :center,
102
+ :valign => :center,
103
+ :bold => true)
104
+ header.item(:tblock).styles(:align => :center,
105
+ :valign => :center,
106
+ :color => 'red',
107
+ :linethrough => true)
108
+ end
109
+
110
+ 1.step(10, 1) do |i|
111
+ # Flag of overflowed list-page.
112
+ is_overflowed = r.page.list(:list).overflow?
113
+
114
+ # Add details.
115
+ r.page.list(:list).add_row do |row|
116
+ case
117
+ when i % 2 == 0
118
+ row.item(:rect).styles(:border_color => 'ff0000',
119
+ :border_width => 3,
120
+ :fill_color => '0000ff')
121
+ row.item(:text).styles(:color => 'red',
126
122
  :align => :left,
127
123
  :valign => :center)
128
- when i % 3 == 0
129
- row.item(:rect).style(:visible, false)
130
- row.item(:text).styles(:color => '0000ff',
131
- :align => :right,
132
- :valign => :bottom)
133
- row.item(:tblock).styles(:color => 'ff0000',
124
+ row.item(:tblock).styles(:color => 'blue',
125
+ :align => :left,
126
+ :valign => :center)
127
+ when i % 3 == 0
128
+ row.item(:rect).style(:visible, false)
129
+ row.item(:text).styles(:color => '0000ff',
134
130
  :align => :right,
135
131
  :valign => :bottom)
132
+ row.item(:tblock).styles(:color => 'ff0000',
133
+ :align => :right,
134
+ :valign => :bottom)
135
+ end
136
136
  end
137
+
138
+ # Change header styles when list-page was overflowed.
139
+ if is_overflowed
140
+ r.page.list(:list).header do |header|
141
+ header.item(:rect).styles(:border_color => 'black',
142
+ :fill_color => '#ffffff')
143
+ header.item(:text).styles(:align => :left,
144
+ :valign => :top,
145
+ :bold => false)
146
+ header.item(:tblock).styles(:align => :left,
147
+ :valign => :top,
148
+ :color => '#000000',
149
+ :linethrough => false)
150
+ end
151
+ end
137
152
  end
138
-
139
- # Change header styles when list-page was overflowed.
140
- if is_overflowed
141
- r.page.list(:list).header do |header|
142
- header.item(:rect).styles(:border_color => 'black',
143
- :fill_color => '#ffffff')
144
- header.item(:text).styles(:align => :left,
145
- :valign => :top,
146
- :bold => false)
147
- header.item(:tblock).styles(:align => :left,
148
- :valign => :top,
149
- :color => '#000000',
150
- :linethrough => false)
151
- end
152
- end
153
153
  end
154
154
  end
@@ -1,20 +1,20 @@
1
1
  # coding: utf-8
2
2
 
3
- CaseRunner.current :eudc
4
-
5
- ThinReports.configure do |config|
6
- config.generator.pdf.eudc_fonts = CaseRunner.case_resource('eudc.ttf')
7
- end
8
-
9
- ThinReports::Report.generate_file(:pdf, CaseRunner.output_file) do
10
- use_layout(CaseRunner.layout_file)
3
+ testcase :eudc, 'Show External Characters' do |t|
4
+ ThinReports.configure do |config|
5
+ config.generator.pdf.eudc_fonts = t.resource('eudc.ttf')
6
+ end
11
7
 
12
- start_new_page
13
-
14
- page.item(:eudc).value('日本で生まれ世界が育てた言語 Ruby')
15
- page.values(:eudc_bold => '太字',
16
- :eudc_italic => '斜体',
17
- :eudc_bold_italic => '太字斜体')
18
- end
8
+ ThinReports::Report.generate(:filename => t.output_filename) do
9
+ use_layout t.layout_filename
10
+
11
+ start_new_page
12
+
13
+ page.item(:eudc).value('日本で生まれ世界が育てた言語 Ruby')
14
+ page.values(:eudc_bold => '太字',
15
+ :eudc_italic => '斜体',
16
+ :eudc_bold_italic => '太字斜体')
17
+ end
19
18
 
20
- ThinReports.config.generator.pdf.eudc_fonts = []
19
+ ThinReports.config.generator.pdf.eudc_fonts = []
20
+ end