rubyword 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/CHANGELOG.txt +10 -0
- data/Gemfile +6 -0
- data/LICENSE +22 -0
- data/README.md +125 -0
- data/Rakefile +4 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/doc/README.md +1 -0
- data/doc/text.md +1 -0
- data/lib/rubyword/configuration.rb +5 -0
- data/lib/rubyword/document.rb +81 -0
- data/lib/rubyword/element/base.rb +12 -0
- data/lib/rubyword/element/image.rb +45 -0
- data/lib/rubyword/element/link.rb +35 -0
- data/lib/rubyword/element/list.rb +35 -0
- data/lib/rubyword/element/page_break.rb +26 -0
- data/lib/rubyword/element/section.rb +67 -0
- data/lib/rubyword/element/text.rb +137 -0
- data/lib/rubyword/element/text_break.rb +20 -0
- data/lib/rubyword/version.rb +3 -0
- data/lib/rubyword/writer/part/base.rb +13 -0
- data/lib/rubyword/writer/part/content_types.rb +39 -0
- data/lib/rubyword/writer/part/doc_props_app.rb +20 -0
- data/lib/rubyword/writer/part/doc_props_core.rb +32 -0
- data/lib/rubyword/writer/part/doc_props_custom.rb +16 -0
- data/lib/rubyword/writer/part/document.rb +56 -0
- data/lib/rubyword/writer/part/font_table.rb +12 -0
- data/lib/rubyword/writer/part/footer.rb +50 -0
- data/lib/rubyword/writer/part/header.rb +40 -0
- data/lib/rubyword/writer/part/numbering.rb +51 -0
- data/lib/rubyword/writer/part/rels.rb +26 -0
- data/lib/rubyword/writer/part/rels_document.rb +31 -0
- data/lib/rubyword/writer/part/settings.rb +93 -0
- data/lib/rubyword/writer/part/styles.rb +91 -0
- data/lib/rubyword/writer/part/theme.rb +12 -0
- data/lib/rubyword/writer/part/toc.rb +89 -0
- data/lib/rubyword/writer/part/web_settings.rb +21 -0
- data/lib/rubyword/writer/style/base.rb +16 -0
- data/lib/rubyword/writer/style/section.rb +65 -0
- data/lib/rubyword/writer.rb +87 -0
- data/lib/rubyword.rb +9 -0
- data/rubyword.gemspec +27 -0
- data/sample/test.rb +78 -0
- data/spec/rubyword/document_spec.rb +11 -0
- data/spec/spec_helper.rb +32 -0
- data/template/fontTable.xml +54 -0
- data/template/theme.xml +284 -0
- metadata +197 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
module Toc
|
6
|
+
def write_toc(rubyword, xml)
|
7
|
+
return if rubyword.toc.nil? || !rubyword.toc[:open]
|
8
|
+
@xml = xml
|
9
|
+
rubyword.sections.each_with_index do |section, section_index|
|
10
|
+
next if section.titles.nil?
|
11
|
+
section.titles.each_with_index do |title, title_index|
|
12
|
+
rid = title[:rid]
|
13
|
+
indent = 0
|
14
|
+
|
15
|
+
@xml.send('w:p') {
|
16
|
+
@xml.send('w:pPr') {
|
17
|
+
@xml.send('w:tabs') {
|
18
|
+
@xml.send('w:tab', 'w:val' => 'right', 'w:leader' => 'dot', 'w:pos' => '9062')
|
19
|
+
}
|
20
|
+
|
21
|
+
# According title size to set tab index, detail: rubyword/element/text.rb
|
22
|
+
if title[:indent] > 0
|
23
|
+
@xml.send('w:ind', 'w:left' => title[:indent])
|
24
|
+
end
|
25
|
+
}
|
26
|
+
|
27
|
+
# initailize in first loop
|
28
|
+
if section_index == 0 && title_index == 0
|
29
|
+
@xml.send('w:r') {
|
30
|
+
@xml.send('w:fldChar', 'w:fldCharType' => 'begin')
|
31
|
+
}
|
32
|
+
|
33
|
+
@xml.send('w:r') {
|
34
|
+
@xml.send('w:instrText', {'xml:space' => 'preserve'}, "TOC \\o 1-10 \\h \\z \\u") # What does '1-13' mean?
|
35
|
+
}
|
36
|
+
|
37
|
+
@xml.send('w:r') {
|
38
|
+
@xml.send('w:fldChar', 'w:fldCharType' => 'separate')
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
@xml.send('w:hyperlink', 'w:anchor' => "_Toc#{rid}", 'w:history' => 1) {
|
43
|
+
@xml.send('w:r') {
|
44
|
+
# add font style
|
45
|
+
if rubyword.toc[:font_size]
|
46
|
+
@xml.send('w:rPr') {
|
47
|
+
@xml.send('w:sz', 'w:val' => rubyword.toc[:font_size])
|
48
|
+
@xml.send('w:szCs', 'w:val' => rubyword.toc[:font_size])
|
49
|
+
}
|
50
|
+
end
|
51
|
+
# add text
|
52
|
+
@xml.send('w:t', title[:text])
|
53
|
+
}
|
54
|
+
|
55
|
+
@xml.send('w:r') {
|
56
|
+
@xml.send('w:tab')
|
57
|
+
}
|
58
|
+
|
59
|
+
@xml.send('w:r') {
|
60
|
+
@xml.send('fldChar', 'w:fldCharType' => 'begin')
|
61
|
+
}
|
62
|
+
|
63
|
+
@xml.send('w:r') {
|
64
|
+
@xml.send('w:instrText', {'xml:space' => 'preserve'}, "PAGEREF _Toc#{rid} \\h")
|
65
|
+
}
|
66
|
+
|
67
|
+
# page numbers
|
68
|
+
# @xml.send('w:r') {
|
69
|
+
# @xml.send('w:t', 1)
|
70
|
+
# }
|
71
|
+
|
72
|
+
@xml.send('w:r') {
|
73
|
+
@xml.send('w:fldChar', 'w:fldCharType' => 'end')
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
# end of fldchar
|
80
|
+
@xml.send('w:p') {
|
81
|
+
@xml.send('w:r') {
|
82
|
+
@xml.send('w:fldChar', 'w:fldCharType' => 'end')
|
83
|
+
}
|
84
|
+
}
|
85
|
+
end # end of write
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Part
|
5
|
+
class WebSettings < Base
|
6
|
+
def write
|
7
|
+
webs = {
|
8
|
+
'xmlns:r' => 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',
|
9
|
+
'xmlns:w' => 'http://schemas.openxmlformats.org/wordprocessingml/2006/main',
|
10
|
+
}
|
11
|
+
builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
|
12
|
+
xml.send('w:webSettings', webs){
|
13
|
+
xml.send('w:optimizeForBrowser')
|
14
|
+
}
|
15
|
+
end
|
16
|
+
builder.to_xml
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Style
|
5
|
+
class Base
|
6
|
+
attr_accessor :rubyword, :style, :section, :xml
|
7
|
+
def initialize(section, xml, rubyword)
|
8
|
+
@style = section.style
|
9
|
+
@section = section
|
10
|
+
@xml = xml
|
11
|
+
@rubyword = rubyword
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
module Rubyword
|
3
|
+
module Writer
|
4
|
+
module Style
|
5
|
+
class Section < Base
|
6
|
+
|
7
|
+
MarginsDefault = {
|
8
|
+
width: 11870,
|
9
|
+
height: 16787,
|
10
|
+
margin: 1440,
|
11
|
+
gutter: 0,
|
12
|
+
header_height: 720,
|
13
|
+
footer_height: 720,
|
14
|
+
column_count: 1,
|
15
|
+
column_spacing: 720
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
Margins = {
|
19
|
+
'w:top' => MarginsDefault[:margin],
|
20
|
+
'w:right' => MarginsDefault[:margin],
|
21
|
+
'w:bottom' => MarginsDefault[:margin],
|
22
|
+
'w:left' => MarginsDefault[:margin],
|
23
|
+
'w:header' => MarginsDefault[:header_height],
|
24
|
+
'w:footer' => MarginsDefault[:footer_height],
|
25
|
+
'w:gutter' => MarginsDefault[:gutter]
|
26
|
+
}
|
27
|
+
|
28
|
+
Orientation = 'portrait'.freeze
|
29
|
+
Landspace = 'landscape'.freeze
|
30
|
+
|
31
|
+
def write
|
32
|
+
@xml.send('w:sectPr') {
|
33
|
+
# header or footerReference
|
34
|
+
|
35
|
+
[@rubyword.header, @rubyword.footer].each do |target|
|
36
|
+
next if target.nil?
|
37
|
+
@xml.send("w:#{target[:type]}Reference", {
|
38
|
+
'w:type' => 'default',
|
39
|
+
'r:id' => "rId#{target[:rid]}"
|
40
|
+
})
|
41
|
+
end
|
42
|
+
|
43
|
+
# pgsize
|
44
|
+
@xml.send('w:pgSz', {
|
45
|
+
'w:orient' => Orientation,
|
46
|
+
'w:w' => MarginsDefault[:width],
|
47
|
+
'w:h' => MarginsDefault[:height]
|
48
|
+
})
|
49
|
+
#borders 暂无
|
50
|
+
|
51
|
+
# pgMar
|
52
|
+
@xml.send('w:pgMar', Margins)
|
53
|
+
# cols
|
54
|
+
@xml.send('w:cols', 'w:num' => MarginsDefault[:column_count], 'w:space' => MarginsDefault[:column_spacing])
|
55
|
+
#Page numbering start 暂无
|
56
|
+
|
57
|
+
# Line numbering 暂无
|
58
|
+
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require_relative "writer/part/base"
|
3
|
+
require_relative "writer/part/toc"
|
4
|
+
require_relative "writer/part/content_types"
|
5
|
+
require_relative "writer/part/doc_props_app"
|
6
|
+
require_relative "writer/part/doc_props_core"
|
7
|
+
require_relative "writer/part/doc_props_custom"
|
8
|
+
require_relative "writer/part/document"
|
9
|
+
require_relative "writer/part/font_table"
|
10
|
+
require_relative "writer/part/numbering"
|
11
|
+
require_relative "writer/part/rels_document"
|
12
|
+
require_relative "writer/part/rels"
|
13
|
+
require_relative "writer/part/settings"
|
14
|
+
require_relative "writer/part/styles"
|
15
|
+
require_relative "writer/part/theme"
|
16
|
+
require_relative "writer/part/web_settings"
|
17
|
+
require_relative "writer/part/footer"
|
18
|
+
require_relative "writer/part/header"
|
19
|
+
# style file
|
20
|
+
require_relative 'writer/style/base'
|
21
|
+
require_relative 'writer/style/section'
|
22
|
+
|
23
|
+
module Rubyword
|
24
|
+
module Writer
|
25
|
+
# word base file
|
26
|
+
DocumentBaseFile = {
|
27
|
+
'ContentTypes' => '[Content_Types].xml',
|
28
|
+
'Rels' => '_rels/.rels',
|
29
|
+
'DocPropsApp' => 'docProps/app.xml',
|
30
|
+
'DocPropsCore' => 'docProps/core.xml',
|
31
|
+
'DocPropsCustom' => 'docProps/custom.xml',
|
32
|
+
'RelsDocument' => 'word/_rels/document.xml.rels',
|
33
|
+
'Document' => 'word/document.xml',
|
34
|
+
'Styles' => 'word/styles.xml',
|
35
|
+
'Numbering' => 'word/numbering.xml',
|
36
|
+
'Settings' => 'word/settings.xml',
|
37
|
+
'WebSettings' => 'word/webSettings.xml',
|
38
|
+
'FontTable' => 'word/fontTable.xml',
|
39
|
+
'Theme' => 'word/theme/theme1.xml'
|
40
|
+
}.freeze
|
41
|
+
|
42
|
+
def save(filename = 'document.docx')
|
43
|
+
buffer = Zip::OutputStream.write_buffer do |zio|
|
44
|
+
write_header_and_footer(zio)
|
45
|
+
|
46
|
+
# write image
|
47
|
+
self.images.each do |image|
|
48
|
+
source = open(image[:path]).read
|
49
|
+
zio.put_next_entry("word/media/#{image[:filename]}")
|
50
|
+
zio.write(source)
|
51
|
+
end
|
52
|
+
|
53
|
+
DocumentBaseFile.each do |helper_method, entry|
|
54
|
+
obj = eval "Part::#{helper_method}.new(self)"
|
55
|
+
source = obj.write
|
56
|
+
zio.put_next_entry(entry)
|
57
|
+
zio.write(source)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
file = File.new(filename,'wb')
|
61
|
+
file.write(buffer.string)
|
62
|
+
file.close
|
63
|
+
end
|
64
|
+
|
65
|
+
def write_header_and_footer(zio)
|
66
|
+
header = self.header
|
67
|
+
footer = self.footer
|
68
|
+
if header
|
69
|
+
elmFile = "word/header#{header[:id]}.xml"
|
70
|
+
obj = Part::Header.new(self)
|
71
|
+
source = obj.write
|
72
|
+
zio.put_next_entry(elmFile)
|
73
|
+
zio.write(source)
|
74
|
+
end
|
75
|
+
|
76
|
+
if footer
|
77
|
+
elmFile = "word/footer#{footer[:id]}.xml"
|
78
|
+
obj = Part::Footer.new(self)
|
79
|
+
source = obj.write
|
80
|
+
zio.put_next_entry(elmFile)
|
81
|
+
zio.write(source)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
data/lib/rubyword.rb
ADDED
data/rubyword.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require "rubyword/version"
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "rubyword"
|
8
|
+
spec.version = Rubyword::VERSION
|
9
|
+
spec.authors = ["young"]
|
10
|
+
spec.email = ["youngjy6@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Generate MS Word for ruby}
|
13
|
+
spec.description = %q{RubyWord is a simple, efficient Word document generation gem and easy to generate docx file.}
|
14
|
+
spec.homepage = "https://github.com/yigger/rubyword"
|
15
|
+
spec.license = "MIT"
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
|
20
|
+
spec.add_development_dependency "bundler", "~> 1.12"
|
21
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
22
|
+
spec.add_development_dependency "rspec"
|
23
|
+
spec.add_development_dependency "nokogiri"
|
24
|
+
spec.add_development_dependency "zip"
|
25
|
+
spec.add_development_dependency "open-uri"
|
26
|
+
spec.add_development_dependency "fastimage"
|
27
|
+
end
|
data/sample/test.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../lib/rubyword'
|
2
|
+
filename = File.join(Rubyword::TEMP_PATH, 'hello.docx')
|
3
|
+
Rubyword::Document::generate(filename) {
|
4
|
+
# write the doc infomation
|
5
|
+
information({
|
6
|
+
company: 'ruby word',
|
7
|
+
creator: 'young',
|
8
|
+
title: 'example word file',
|
9
|
+
description: 'this is a example docx',
|
10
|
+
subject: 'how to create doc info',
|
11
|
+
keywords: 'remark',
|
12
|
+
category: 'category'
|
13
|
+
})
|
14
|
+
|
15
|
+
# Generate the directory structure
|
16
|
+
title_directory font_size: 24
|
17
|
+
|
18
|
+
# insert header
|
19
|
+
add_header 'rubyword'
|
20
|
+
|
21
|
+
# insert footer with number
|
22
|
+
add_footer nil, text_align: 'center', nums_type: 'number'
|
23
|
+
# insert text
|
24
|
+
# add_footer 'hello', text_align: 'center'
|
25
|
+
# initialize section and insert something in the section
|
26
|
+
section {
|
27
|
+
# insert title
|
28
|
+
title_1 "It's a title", ignore_dir: true
|
29
|
+
# insert subtitle
|
30
|
+
title_2 "It's a subtitle"
|
31
|
+
# insert title
|
32
|
+
title_1 'Database'
|
33
|
+
# insert subtitle
|
34
|
+
title_2 'MySQL'
|
35
|
+
# insert No.3 title
|
36
|
+
title_3 'NoSQL'
|
37
|
+
# text break
|
38
|
+
text_break 3
|
39
|
+
# insert text
|
40
|
+
text 'hello word', bgcolor: 'yellow', text_align: 'center'
|
41
|
+
# page break
|
42
|
+
page_break 2
|
43
|
+
# insert text
|
44
|
+
text 'hello word', indent_between: '1440-1440'
|
45
|
+
text 'title', { font_size: 62, color: '996699', blod: true, text_align: 'center' }
|
46
|
+
|
47
|
+
# insert title
|
48
|
+
title_1 'section2 title'
|
49
|
+
title_2 'section2 title'
|
50
|
+
title_3 'section2 title'
|
51
|
+
|
52
|
+
# add a link
|
53
|
+
link 'baidu', 'http://www.baidu.com', text_align: 'center'
|
54
|
+
}
|
55
|
+
|
56
|
+
section {
|
57
|
+
# insert a text
|
58
|
+
text 'another Section', bgcolor: 'yellow', text_align: 'center'
|
59
|
+
|
60
|
+
# insert a text
|
61
|
+
text 'hello word', indent_between: '1440-1440'
|
62
|
+
text 'title', { font_size: 62, color: '996699', blod: true, text_align: 'center' }
|
63
|
+
}
|
64
|
+
|
65
|
+
section {
|
66
|
+
list 'test1', 1
|
67
|
+
list 'test1', 2
|
68
|
+
list 'test3', 2
|
69
|
+
list 'test2', 1
|
70
|
+
list 'test2', 1
|
71
|
+
}
|
72
|
+
|
73
|
+
section {
|
74
|
+
# add a link
|
75
|
+
link 'baidu', 'http://www.baidu.com', text_align: 'center'
|
76
|
+
image 'http://www.baidu.com/img/bd_logo1.png'
|
77
|
+
}
|
78
|
+
}
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require "rubyword"
|
2
|
+
RSpec.configure do |config|
|
3
|
+
# rspec-expectations config goes here. You can use an alternate
|
4
|
+
# assertion/expectation library such as wrong or the stdlib/minitest
|
5
|
+
# assertions if you prefer.
|
6
|
+
config.expect_with :rspec do |expectations|
|
7
|
+
# This option will default to `true` in RSpec 4. It makes the `description`
|
8
|
+
# and `failure_message` of custom matchers include text for helper methods
|
9
|
+
# defined using `chain`, e.g.:
|
10
|
+
# be_bigger_than(2).and_smaller_than(4).description
|
11
|
+
# # => "be bigger than 2 and smaller than 4"
|
12
|
+
# ...rather than:
|
13
|
+
# # => "be bigger than 2"
|
14
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
15
|
+
end
|
16
|
+
|
17
|
+
# rspec-mocks config goes here. You can use an alternate test double
|
18
|
+
# library (such as bogus or mocha) by changing the `mock_with` option here.
|
19
|
+
config.mock_with :rspec do |mocks|
|
20
|
+
# Prevents you from mocking or stubbing a method that does not exist on
|
21
|
+
# a real object. This is generally recommended, and will default to
|
22
|
+
# `true` in RSpec 4.
|
23
|
+
mocks.verify_partial_doubles = true
|
24
|
+
end
|
25
|
+
|
26
|
+
# This option will default to `:apply_to_host_groups` in RSpec 4 (and will
|
27
|
+
# have no way to turn it off -- the option exists only for backwards
|
28
|
+
# compatibility in RSpec 3). It causes shared context metadata to be
|
29
|
+
# inherited by the metadata hash of host groups and examples, rather than
|
30
|
+
# triggering implicit auto-inclusion in groups with matching metadata.
|
31
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
32
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
2
|
+
<w:fonts
|
3
|
+
xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
|
4
|
+
xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
|
5
|
+
<w:font w:name="Times New Roman">
|
6
|
+
<w:panose1 w:val="02020603050405020304" />
|
7
|
+
<w:charset w:val="00" />
|
8
|
+
<w:family w:val="roman" />
|
9
|
+
<w:pitch w:val="variable" />
|
10
|
+
<w:sig w:usb0="E0002AFF" w:usb1="C0007841" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000" />
|
11
|
+
</w:font>
|
12
|
+
<w:font w:name="Courier New">
|
13
|
+
<w:panose1 w:val="02070309020205020404" />
|
14
|
+
<w:charset w:val="00" />
|
15
|
+
<w:family w:val="modern" />
|
16
|
+
<w:pitch w:val="fixed" />
|
17
|
+
<w:sig w:usb0="E0002AFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000" />
|
18
|
+
</w:font>
|
19
|
+
<w:font w:name="Wingdings">
|
20
|
+
<w:panose1 w:val="05000000000000000000" />
|
21
|
+
<w:charset w:val="02" />
|
22
|
+
<w:family w:val="auto" />
|
23
|
+
<w:pitch w:val="variable" />
|
24
|
+
<w:sig w:usb0="00000000" w:usb1="10000000" w:usb2="00000000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000" />
|
25
|
+
</w:font>
|
26
|
+
<w:font w:name="Symbol">
|
27
|
+
<w:panose1 w:val="05050102010706020507" />
|
28
|
+
<w:charset w:val="02" />
|
29
|
+
<w:family w:val="roman" />
|
30
|
+
<w:pitch w:val="variable" />
|
31
|
+
<w:sig w:usb0="00000000" w:usb1="10000000" w:usb2="00000000" w:usb3="00000000" w:csb0="80000000" w:csb1="00000000" />
|
32
|
+
</w:font>
|
33
|
+
<w:font w:name="Arial">
|
34
|
+
<w:panose1 w:val="020B0604020202020204" />
|
35
|
+
<w:charset w:val="00" />
|
36
|
+
<w:family w:val="swiss" />
|
37
|
+
<w:pitch w:val="variable" />
|
38
|
+
<w:sig w:usb0="E0002AFF" w:usb1="C0007843" w:usb2="00000009" w:usb3="00000000" w:csb0="000001FF" w:csb1="00000000" />
|
39
|
+
</w:font>
|
40
|
+
<w:font w:name="Cambria">
|
41
|
+
<w:panose1 w:val="02040503050406030204" />
|
42
|
+
<w:charset w:val="00" />
|
43
|
+
<w:family w:val="roman" />
|
44
|
+
<w:pitch w:val="variable" />
|
45
|
+
<w:sig w:usb0="A00002EF" w:usb1="4000004B" w:usb2="00000000" w:usb3="00000000" w:csb0="0000019F" w:csb1="00000000" />
|
46
|
+
</w:font>
|
47
|
+
<w:font w:name="Calibri">
|
48
|
+
<w:panose1 w:val="020F0502020204030204" />
|
49
|
+
<w:charset w:val="00" />
|
50
|
+
<w:family w:val="swiss" />
|
51
|
+
<w:pitch w:val="variable" />
|
52
|
+
<w:sig w:usb0="E10002FF" w:usb1="4000ACFF" w:usb2="00000009" w:usb3="00000000" w:csb0="0000019F" w:csb1="00000000" />
|
53
|
+
</w:font>
|
54
|
+
</w:fonts>
|