hexapdf 0.4.0 → 0.5.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/CHANGELOG.md +46 -0
- data/CONTRIBUTERS +1 -1
- data/README.md +5 -5
- data/VERSION +1 -1
- data/examples/emoji-smile.png +0 -0
- data/examples/emoji-wink.png +0 -0
- data/examples/graphics.rb +9 -8
- data/examples/standard_pdf_fonts.rb +2 -1
- data/examples/text_box_alignment.rb +47 -0
- data/examples/text_box_inline_boxes.rb +56 -0
- data/examples/text_box_line_wrapping.rb +57 -0
- data/examples/text_box_shapes.rb +166 -0
- data/examples/text_box_styling.rb +72 -0
- data/examples/truetype.rb +3 -4
- data/lib/hexapdf/cli/optimize.rb +2 -2
- data/lib/hexapdf/configuration.rb +8 -6
- data/lib/hexapdf/content/canvas.rb +8 -5
- data/lib/hexapdf/content/parser.rb +3 -2
- data/lib/hexapdf/content/processor.rb +14 -3
- data/lib/hexapdf/document.rb +1 -0
- data/lib/hexapdf/document/fonts.rb +2 -1
- data/lib/hexapdf/document/pages.rb +23 -0
- data/lib/hexapdf/font/invalid_glyph.rb +78 -0
- data/lib/hexapdf/font/true_type/font.rb +14 -3
- data/lib/hexapdf/font/true_type/table.rb +1 -0
- data/lib/hexapdf/font/true_type/table/cmap.rb +1 -1
- data/lib/hexapdf/font/true_type/table/cmap_subtable.rb +1 -0
- data/lib/hexapdf/font/true_type/table/glyf.rb +4 -0
- data/lib/hexapdf/font/true_type/table/kern.rb +170 -0
- data/lib/hexapdf/font/true_type/table/post.rb +5 -1
- data/lib/hexapdf/font/true_type_wrapper.rb +71 -24
- data/lib/hexapdf/font/type1/afm_parser.rb +3 -2
- data/lib/hexapdf/font/type1/character_metrics.rb +0 -9
- data/lib/hexapdf/font/type1/font.rb +11 -0
- data/lib/hexapdf/font/type1/font_metrics.rb +6 -1
- data/lib/hexapdf/font/type1_wrapper.rb +51 -7
- data/lib/hexapdf/font_loader/standard14.rb +1 -1
- data/lib/hexapdf/layout.rb +51 -0
- data/lib/hexapdf/layout/inline_box.rb +95 -0
- data/lib/hexapdf/layout/line_fragment.rb +333 -0
- data/lib/hexapdf/layout/numeric_refinements.rb +56 -0
- data/lib/hexapdf/layout/style.rb +365 -0
- data/lib/hexapdf/layout/text_box.rb +727 -0
- data/lib/hexapdf/layout/text_fragment.rb +206 -0
- data/lib/hexapdf/layout/text_shaper.rb +155 -0
- data/lib/hexapdf/task.rb +0 -1
- data/lib/hexapdf/task/dereference.rb +1 -1
- data/lib/hexapdf/tokenizer.rb +3 -2
- data/lib/hexapdf/type/font_descriptor.rb +2 -1
- data/lib/hexapdf/type/font_type0.rb +3 -1
- data/lib/hexapdf/type/form.rb +12 -4
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +7 -0
- data/test/hexapdf/content/common.rb +8 -0
- data/test/hexapdf/content/test_canvas.rb +10 -22
- data/test/hexapdf/content/test_processor.rb +4 -1
- data/test/hexapdf/document/test_pages.rb +16 -0
- data/test/hexapdf/font/test_invalid_glyph.rb +34 -0
- data/test/hexapdf/font/test_true_type_wrapper.rb +25 -11
- data/test/hexapdf/font/test_type1_wrapper.rb +26 -10
- data/test/hexapdf/font/true_type/table/common.rb +27 -0
- data/test/hexapdf/font/true_type/table/test_cmap.rb +14 -20
- data/test/hexapdf/font/true_type/table/test_cmap_subtable.rb +7 -0
- data/test/hexapdf/font/true_type/table/test_glyf.rb +8 -6
- data/test/hexapdf/font/true_type/table/test_head.rb +9 -13
- data/test/hexapdf/font/true_type/table/test_hhea.rb +16 -23
- data/test/hexapdf/font/true_type/table/test_hmtx.rb +4 -7
- data/test/hexapdf/font/true_type/table/test_kern.rb +61 -0
- data/test/hexapdf/font/true_type/table/test_loca.rb +7 -13
- data/test/hexapdf/font/true_type/table/test_maxp.rb +4 -9
- data/test/hexapdf/font/true_type/table/test_name.rb +14 -17
- data/test/hexapdf/font/true_type/table/test_os2.rb +3 -5
- data/test/hexapdf/font/true_type/table/test_post.rb +21 -19
- data/test/hexapdf/font/true_type/test_font.rb +4 -0
- data/test/hexapdf/font/type1/common.rb +6 -0
- data/test/hexapdf/font/type1/test_afm_parser.rb +9 -0
- data/test/hexapdf/font/type1/test_font.rb +6 -0
- data/test/hexapdf/layout/test_inline_box.rb +40 -0
- data/test/hexapdf/layout/test_line_fragment.rb +206 -0
- data/test/hexapdf/layout/test_style.rb +143 -0
- data/test/hexapdf/layout/test_text_box.rb +640 -0
- data/test/hexapdf/layout/test_text_fragment.rb +208 -0
- data/test/hexapdf/layout/test_text_shaper.rb +64 -0
- data/test/hexapdf/task/test_dereference.rb +1 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/test_font_descriptor.rb +4 -2
- data/test/hexapdf/type/test_font_type0.rb +7 -0
- data/test/hexapdf/type/test_form.rb +12 -0
- metadata +29 -2
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require_relative '../content/common'
|
|
5
|
+
require 'hexapdf/document'
|
|
6
|
+
require 'hexapdf/layout/text_fragment'
|
|
7
|
+
|
|
8
|
+
# Numeric values were manually calculated using the information from the AFM file.
|
|
9
|
+
describe HexaPDF::Layout::TextFragment do
|
|
10
|
+
before do
|
|
11
|
+
@doc = HexaPDF::Document.new
|
|
12
|
+
@font = @doc.fonts.load("Times", custom_encoding: true)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def setup_fragment(items, text_rise = 0)
|
|
16
|
+
style = HexaPDF::Layout::Style.new(font: @font, font_size: 20,
|
|
17
|
+
horizontal_scaling: 200, character_spacing: 1,
|
|
18
|
+
word_spacing: 2, text_rise: text_rise)
|
|
19
|
+
@fragment = HexaPDF::Layout::TextFragment.new(items: items, style: style)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "creates a TextFragment from text and options" do
|
|
23
|
+
frag = HexaPDF::Layout::TextFragment.create("Tom", font: @font, font_size: 20,
|
|
24
|
+
font_features: {kern: true})
|
|
25
|
+
assert_equal(4, frag.items.length)
|
|
26
|
+
assert_equal(36.18, frag.width)
|
|
27
|
+
assert_equal(13.66 + 4.34, frag.height)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
it "returns :text for valign" do
|
|
31
|
+
assert_equal(:text, setup_fragment([]).valign)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "draws the text onto the canvas" do
|
|
35
|
+
setup_fragment(@font.decode_utf8('H'), 2)
|
|
36
|
+
canvas = @doc.pages.add.canvas
|
|
37
|
+
@fragment.draw(canvas, 10, 15)
|
|
38
|
+
assert_operators(canvas.contents,
|
|
39
|
+
[[:begin_text],
|
|
40
|
+
[:set_text_matrix, [1, 0, 0, 1, 10, 15]],
|
|
41
|
+
[:set_font_and_size, [:F1, 20]],
|
|
42
|
+
[:set_leading, [24.0]],
|
|
43
|
+
[:set_horizontal_scaling, [200]],
|
|
44
|
+
[:set_character_spacing, [1]],
|
|
45
|
+
[:set_word_spacing, [2]],
|
|
46
|
+
[:set_text_rise, [2]],
|
|
47
|
+
[:show_text_with_positioning, [['!']]]])
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "empty fragment" do
|
|
51
|
+
before do
|
|
52
|
+
setup_fragment([])
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "calculates the x_min" do
|
|
56
|
+
assert_equal(0, @fragment.x_min)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "calculates the x_max" do
|
|
60
|
+
assert_equal(0, @fragment.x_max)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "calculates the y_min" do
|
|
64
|
+
assert_equal(-4.34, @fragment.y_min)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
it "calculates the y_max" do
|
|
68
|
+
assert_equal(13.66, @fragment.y_max)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
it "calculates the width" do
|
|
72
|
+
assert_equal(0, @fragment.width)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it "calculates the height" do
|
|
76
|
+
assert_equal(13.66 + 4.34, @fragment.height)
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
describe "normal text" do
|
|
81
|
+
before do
|
|
82
|
+
setup_fragment(@font.decode_utf8("Hal lo").insert(2, -35).insert(1, -10))
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "calculates the x_min" do
|
|
86
|
+
assert_in_delta(0.76, @fragment.x_min)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "calculates the x_max" do
|
|
90
|
+
assert_in_delta(116.68 - 1.2 - 2, @fragment.x_max)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "calculates the exact y_min" do
|
|
94
|
+
assert_in_delta(-0.2, @fragment.exact_y_min)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "calculates the exact y_max" do
|
|
98
|
+
assert_in_delta(13.66, @fragment.exact_y_max)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "calculates the y_min" do
|
|
102
|
+
assert_in_delta(-4.34, @fragment.y_min)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "calculates the y_max" do
|
|
106
|
+
assert_in_delta(13.66, @fragment.y_max)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "calculates the width" do
|
|
110
|
+
assert_in_delta(116.68, @fragment.width)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "calculates the height" do
|
|
114
|
+
assert_in_delta(13.66 + 4.34, @fragment.height)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe "with a positive text rise" do
|
|
119
|
+
before do
|
|
120
|
+
setup_fragment(@font.decode_utf8("l,"), 4)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "calculates the y_min" do
|
|
124
|
+
assert_in_delta(-4.34 + 4, @fragment.y_min)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
it "calculates the y_max" do
|
|
128
|
+
assert_in_delta(13.66 + 4, @fragment.y_max)
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
it "calculates the height" do
|
|
132
|
+
assert_in_delta(13.66 + 4 + 0.34, @fragment.height)
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
describe "with a negative text rise" do
|
|
137
|
+
before do
|
|
138
|
+
setup_fragment(@font.decode_utf8("l,"), -15)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
it "calculates the y_min" do
|
|
142
|
+
assert_in_delta(-4.34 - 15, @fragment.y_min)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "calculates the y_max" do
|
|
146
|
+
assert_in_delta(13.66 - 15, @fragment.y_max)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
it "calculates the height" do
|
|
150
|
+
assert_in_delta(4.34 + 15, @fragment.height)
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe "with a glyph without outline as last item" do
|
|
155
|
+
before do
|
|
156
|
+
setup_fragment(@font.decode_utf8("H "))
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "calculates the x_max" do
|
|
160
|
+
assert_in_delta(46.88 - 2 - 4, @fragment.x_max)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
it "calculates the width" do
|
|
164
|
+
assert_in_delta(46.88, @fragment.width)
|
|
165
|
+
end
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
describe "with a glyph with x_min < 0 and x_max > width as first and last item" do
|
|
169
|
+
before do
|
|
170
|
+
setup_fragment(@font.decode_utf8("\u{2044}o\u{2044}".unicode_normalize(:nfd)))
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
it "calculates the x_min" do
|
|
174
|
+
assert_in_delta(-6.72, @fragment.x_min)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
it "calculates the x_max" do
|
|
178
|
+
assert_in_delta(39.36 + 6.56 - 2, @fragment.x_max)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
it "calculates the width" do
|
|
182
|
+
assert_in_delta(39.36, @fragment.width)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
describe "with positive kerning values as first and last items" do
|
|
187
|
+
before do
|
|
188
|
+
setup_fragment([100, 100] + @font.decode_utf8("Hallo") + [100, 100])
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "calculates the x_min" do
|
|
192
|
+
assert_in_delta(-7.24, @fragment.x_min)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
it "calculates the x_max" do
|
|
196
|
+
assert_in_delta(82.88 - 1.2 - 2 - -4 - -4, @fragment.x_max)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "calculates the width" do
|
|
200
|
+
assert_in_delta(82.88, @fragment.width)
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "can be inspected" do
|
|
205
|
+
frag = setup_fragment(@font.decode_utf8("H"))
|
|
206
|
+
assert_match(/:H/, frag.inspect)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require_relative '../font/true_type/table/common'
|
|
5
|
+
require 'hexapdf/document'
|
|
6
|
+
require 'hexapdf/font/true_type_wrapper'
|
|
7
|
+
require 'hexapdf/layout/text_shaper'
|
|
8
|
+
|
|
9
|
+
using HexaPDF::Layout::NumericRefinements
|
|
10
|
+
|
|
11
|
+
describe HexaPDF::Layout::TextShaper do
|
|
12
|
+
before do
|
|
13
|
+
@doc = HexaPDF::Document.new
|
|
14
|
+
@shaper = HexaPDF::Layout::TextShaper.new
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def setup_fragment(items, **options)
|
|
18
|
+
style = HexaPDF::Layout::Style.new(font: @font, font_size: 20, font_features: options)
|
|
19
|
+
HexaPDF::Layout::TextFragment.new(items: items, style: style)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "Type1 font features" do
|
|
23
|
+
before do
|
|
24
|
+
@font = @doc.fonts.load("Times", custom_encoding: true)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "handles ligatures" do
|
|
28
|
+
fragment = setup_fragment(@font.decode_utf8('fish fish fi').insert(1, 100).
|
|
29
|
+
insert(0, 100), liga: true)
|
|
30
|
+
@shaper.shape_text(fragment)
|
|
31
|
+
assert_equal([100, :fi, :s, :h, :space, :fi, :s, :h, :space, :fi],
|
|
32
|
+
fragment.items.map {|item| item.kind_of?(Numeric) ? item : item.id})
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "handles kerning" do
|
|
36
|
+
fragment = setup_fragment(@font.decode_utf8('fish fish wow').insert(1, 100), kern: true)
|
|
37
|
+
@shaper.shape_text(fragment)
|
|
38
|
+
assert_equal([:f, 100, :i, :s, :h, :space, :f, 20, :i, :s, :h, :space, :w, 10, :o, 25, :w],
|
|
39
|
+
fragment.items.map {|item| item.kind_of?(Numeric) ? item : item.id})
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe "TrueType font features" do
|
|
44
|
+
before do
|
|
45
|
+
font_file = File.join(TEST_DATA_DIR, "fonts", "Ubuntu-Title.ttf")
|
|
46
|
+
@wrapped_font = HexaPDF::Font::TrueType::Font.new(File.open(font_file))
|
|
47
|
+
@font = HexaPDF::Font::TrueTypeWrapper.new(@doc, @wrapped_font)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "handles kerning" do
|
|
51
|
+
data = [0, 1].pack('n2') << \
|
|
52
|
+
[0, 6 + 8 + 12, 0x1].pack('n3') << \
|
|
53
|
+
[2, 0, 0, 0, 53, 80, -20, 80, 81, -10].pack('n4n2s>n2s>')
|
|
54
|
+
table = create_table(:Kern, data, standalone: true)
|
|
55
|
+
@wrapped_font.instance_eval { @tables[:kern] = table }
|
|
56
|
+
fragment = setup_fragment(@font.decode_utf8('Top Top').insert(1, 100), kern: true)
|
|
57
|
+
@shaper.shape_text(fragment)
|
|
58
|
+
assert_equal([53, [100], 80, [10], 81, 3, 53, [20], 80, [10], 81],
|
|
59
|
+
fragment.items.map {|item| item.kind_of?(Numeric) ? [item] : item.id})
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
|
|
@@ -17,6 +17,7 @@ describe HexaPDF::Task::Dereference do
|
|
|
17
17
|
pages = @doc.wrap(Type: :Pages)
|
|
18
18
|
pages.add_page(@doc.wrap(Type: :Page))
|
|
19
19
|
@doc.trailer[:Test2] = pages
|
|
20
|
+
@doc.trailer[:InvalidRef] = HexaPDF::Reference.new(5000, 2)
|
|
20
21
|
|
|
21
22
|
checker = lambda do |val, done = {}|
|
|
22
23
|
case val
|
data/test/hexapdf/test_writer.rb
CHANGED
|
@@ -40,7 +40,7 @@ startxref
|
|
|
40
40
|
219
|
|
41
41
|
%%EOF
|
|
42
42
|
3 0 obj
|
|
43
|
-
<</Producer(HexaPDF version 0.
|
|
43
|
+
<</Producer(HexaPDF version 0.5.0)>>
|
|
44
44
|
endobj
|
|
45
45
|
xref
|
|
46
46
|
3 1
|
|
@@ -72,7 +72,7 @@ startxref
|
|
|
72
72
|
141
|
|
73
73
|
%%EOF
|
|
74
74
|
6 0 obj
|
|
75
|
-
<</Producer(HexaPDF version 0.
|
|
75
|
+
<</Producer(HexaPDF version 0.5.0)>>
|
|
76
76
|
endobj
|
|
77
77
|
2 0 obj
|
|
78
78
|
<</Length 10>>stream
|
|
@@ -43,9 +43,11 @@ describe HexaPDF::Type::FontDescriptor do
|
|
|
43
43
|
refute(@font_desc.validate)
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
-
it "
|
|
46
|
+
it "updates the /Descent value if it is not a negative number" do
|
|
47
47
|
@font_desc[:Descent] = 5
|
|
48
|
-
refute(@font_desc.validate)
|
|
48
|
+
refute(@font_desc.validate(auto_correct: false))
|
|
49
|
+
assert(@font_desc.validate)
|
|
50
|
+
assert_equal(-5, @font_desc[:Descent])
|
|
49
51
|
end
|
|
50
52
|
end
|
|
51
53
|
end
|
|
@@ -19,6 +19,13 @@ describe HexaPDF::Type::FontType0 do
|
|
|
19
19
|
assert_equal(:vertical, font.writing_mode)
|
|
20
20
|
end
|
|
21
21
|
|
|
22
|
+
it "resolves the descendant font object correctly" do
|
|
23
|
+
assert_equal(@cid_font, @font.descendant_font)
|
|
24
|
+
@doc.clear_cache
|
|
25
|
+
@font[:DescendantFonts] = [@cid_font.value]
|
|
26
|
+
assert_equal(@cid_font.value, @font.descendant_font.value)
|
|
27
|
+
end
|
|
28
|
+
|
|
22
29
|
it "uses the descendant font for getting the width of a code point" do
|
|
23
30
|
assert_equal(100, @font.width(0x2121))
|
|
24
31
|
end
|
|
@@ -55,6 +55,18 @@ describe HexaPDF::Type::Form do
|
|
|
55
55
|
processor = TestHelper::OperatorRecorder.new
|
|
56
56
|
@form.process_contents(processor)
|
|
57
57
|
assert_equal([[:set_line_width, [10]]], processor.recorded_ops)
|
|
58
|
+
assert_nil(@form[:Resources])
|
|
59
|
+
|
|
60
|
+
resources = @form.resources
|
|
61
|
+
@form.process_contents(processor)
|
|
62
|
+
assert_same(resources, processor.resources)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "uses the provided resources if it has no resources itself" do
|
|
66
|
+
resources = @doc.wrap({}, type: :XXResources)
|
|
67
|
+
processor = TestHelper::OperatorRecorder.new
|
|
68
|
+
@form.process_contents(processor, original_resources: resources)
|
|
69
|
+
assert_same(resources, processor.resources)
|
|
58
70
|
end
|
|
59
71
|
end
|
|
60
72
|
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: hexapdf
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.5.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Thomas Leitner
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2017-
|
|
11
|
+
date: 2017-06-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cmdparse
|
|
@@ -155,6 +155,8 @@ files:
|
|
|
155
155
|
- data/hexapdf/encoding/glyphlist.txt
|
|
156
156
|
- data/hexapdf/encoding/zapfdingbats.txt
|
|
157
157
|
- examples/arc.rb
|
|
158
|
+
- examples/emoji-smile.png
|
|
159
|
+
- examples/emoji-wink.png
|
|
158
160
|
- examples/graphics.rb
|
|
159
161
|
- examples/hello_world.rb
|
|
160
162
|
- examples/machupicchu.jpg
|
|
@@ -162,6 +164,11 @@ files:
|
|
|
162
164
|
- examples/optimizing.rb
|
|
163
165
|
- examples/show_char_bboxes.rb
|
|
164
166
|
- examples/standard_pdf_fonts.rb
|
|
167
|
+
- examples/text_box_alignment.rb
|
|
168
|
+
- examples/text_box_inline_boxes.rb
|
|
169
|
+
- examples/text_box_line_wrapping.rb
|
|
170
|
+
- examples/text_box_shapes.rb
|
|
171
|
+
- examples/text_box_styling.rb
|
|
165
172
|
- examples/truetype.rb
|
|
166
173
|
- lib/hexapdf.rb
|
|
167
174
|
- lib/hexapdf/cli.rb
|
|
@@ -229,6 +236,7 @@ files:
|
|
|
229
236
|
- lib/hexapdf/font/encoding/symbol_encoding.rb
|
|
230
237
|
- lib/hexapdf/font/encoding/win_ansi_encoding.rb
|
|
231
238
|
- lib/hexapdf/font/encoding/zapf_dingbats_encoding.rb
|
|
239
|
+
- lib/hexapdf/font/invalid_glyph.rb
|
|
232
240
|
- lib/hexapdf/font/true_type.rb
|
|
233
241
|
- lib/hexapdf/font/true_type/builder.rb
|
|
234
242
|
- lib/hexapdf/font/true_type/font.rb
|
|
@@ -242,6 +250,7 @@ files:
|
|
|
242
250
|
- lib/hexapdf/font/true_type/table/head.rb
|
|
243
251
|
- lib/hexapdf/font/true_type/table/hhea.rb
|
|
244
252
|
- lib/hexapdf/font/true_type/table/hmtx.rb
|
|
253
|
+
- lib/hexapdf/font/true_type/table/kern.rb
|
|
245
254
|
- lib/hexapdf/font/true_type/table/loca.rb
|
|
246
255
|
- lib/hexapdf/font/true_type/table/maxp.rb
|
|
247
256
|
- lib/hexapdf/font/true_type/table/name.rb
|
|
@@ -263,6 +272,14 @@ files:
|
|
|
263
272
|
- lib/hexapdf/image_loader/pdf.rb
|
|
264
273
|
- lib/hexapdf/image_loader/png.rb
|
|
265
274
|
- lib/hexapdf/importer.rb
|
|
275
|
+
- lib/hexapdf/layout.rb
|
|
276
|
+
- lib/hexapdf/layout/inline_box.rb
|
|
277
|
+
- lib/hexapdf/layout/line_fragment.rb
|
|
278
|
+
- lib/hexapdf/layout/numeric_refinements.rb
|
|
279
|
+
- lib/hexapdf/layout/style.rb
|
|
280
|
+
- lib/hexapdf/layout/text_box.rb
|
|
281
|
+
- lib/hexapdf/layout/text_fragment.rb
|
|
282
|
+
- lib/hexapdf/layout/text_shaper.rb
|
|
266
283
|
- lib/hexapdf/name_tree_node.rb
|
|
267
284
|
- lib/hexapdf/number_tree_node.rb
|
|
268
285
|
- lib/hexapdf/object.rb
|
|
@@ -423,9 +440,11 @@ files:
|
|
|
423
440
|
- test/hexapdf/font/encoding/test_zapf_dingbats_encoding.rb
|
|
424
441
|
- test/hexapdf/font/test_cmap.rb
|
|
425
442
|
- test/hexapdf/font/test_encoding.rb
|
|
443
|
+
- test/hexapdf/font/test_invalid_glyph.rb
|
|
426
444
|
- test/hexapdf/font/test_true_type_wrapper.rb
|
|
427
445
|
- test/hexapdf/font/test_type1_wrapper.rb
|
|
428
446
|
- test/hexapdf/font/true_type/common.rb
|
|
447
|
+
- test/hexapdf/font/true_type/table/common.rb
|
|
429
448
|
- test/hexapdf/font/true_type/table/test_cmap.rb
|
|
430
449
|
- test/hexapdf/font/true_type/table/test_cmap_subtable.rb
|
|
431
450
|
- test/hexapdf/font/true_type/table/test_directory.rb
|
|
@@ -433,6 +452,7 @@ files:
|
|
|
433
452
|
- test/hexapdf/font/true_type/table/test_head.rb
|
|
434
453
|
- test/hexapdf/font/true_type/table/test_hhea.rb
|
|
435
454
|
- test/hexapdf/font/true_type/table/test_hmtx.rb
|
|
455
|
+
- test/hexapdf/font/true_type/table/test_kern.rb
|
|
436
456
|
- test/hexapdf/font/true_type/table/test_loca.rb
|
|
437
457
|
- test/hexapdf/font/true_type/table/test_maxp.rb
|
|
438
458
|
- test/hexapdf/font/true_type/table/test_name.rb
|
|
@@ -443,6 +463,7 @@ files:
|
|
|
443
463
|
- test/hexapdf/font/true_type/test_optimizer.rb
|
|
444
464
|
- test/hexapdf/font/true_type/test_subsetter.rb
|
|
445
465
|
- test/hexapdf/font/true_type/test_table.rb
|
|
466
|
+
- test/hexapdf/font/type1/common.rb
|
|
446
467
|
- test/hexapdf/font/type1/test_afm_parser.rb
|
|
447
468
|
- test/hexapdf/font/type1/test_font.rb
|
|
448
469
|
- test/hexapdf/font/type1/test_font_metrics.rb
|
|
@@ -452,6 +473,12 @@ files:
|
|
|
452
473
|
- test/hexapdf/image_loader/test_jpeg.rb
|
|
453
474
|
- test/hexapdf/image_loader/test_pdf.rb
|
|
454
475
|
- test/hexapdf/image_loader/test_png.rb
|
|
476
|
+
- test/hexapdf/layout/test_inline_box.rb
|
|
477
|
+
- test/hexapdf/layout/test_line_fragment.rb
|
|
478
|
+
- test/hexapdf/layout/test_style.rb
|
|
479
|
+
- test/hexapdf/layout/test_text_box.rb
|
|
480
|
+
- test/hexapdf/layout/test_text_fragment.rb
|
|
481
|
+
- test/hexapdf/layout/test_text_shaper.rb
|
|
455
482
|
- test/hexapdf/task/test_dereference.rb
|
|
456
483
|
- test/hexapdf/task/test_optimize.rb
|
|
457
484
|
- test/hexapdf/test_configuration.rb
|