hexapdf 0.35.0 → 0.35.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/lib/hexapdf/composer.rb +2 -1
- data/lib/hexapdf/content/canvas_composer.rb +1 -1
- data/lib/hexapdf/content/graphic_object/endpoint_arc.rb +2 -8
- data/lib/hexapdf/document.rb +1 -0
- data/lib/hexapdf/layout/box.rb +3 -2
- data/lib/hexapdf/layout/frame.rb +1 -1
- data/lib/hexapdf/layout/width_from_polygon.rb +1 -1
- data/lib/hexapdf/type/icon_fit.rb +2 -2
- data/lib/hexapdf/type/page.rb +35 -35
- data/lib/hexapdf/utils.rb +66 -0
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/content/test_canvas_composer.rb +5 -5
- data/test/hexapdf/document/test_pages.rb +5 -5
- data/test/hexapdf/layout/test_box.rb +7 -0
- data/test/hexapdf/layout/test_column_box.rb +4 -4
- data/test/hexapdf/layout/test_page_style.rb +5 -5
- data/test/hexapdf/test_composer.rb +13 -13
- data/test/hexapdf/test_utils.rb +20 -0
- data/test/hexapdf/test_writer.rb +3 -3
- data/test/hexapdf/type/test_page.rb +3 -3
- data/test/hexapdf/type/test_page_tree_node.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a7769176f4b753c876ecfb95a6cd2a954249388a7da9e308fbd8c25ba071c9b
|
4
|
+
data.tar.gz: f39b081ab1408fd08a3dff88f8aa3417283e98478b3e9fad60a692afb16e92c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 21fcdbd57cdcf436edd1de50f0268d05573b92b70edd1eafeb00af0414eed3cbaa8f107ac1310419a29a113dc5a33ec991fa49a4fa0b47edea1bd2eb7afb0768
|
7
|
+
data.tar.gz: 0c6732024ebd325a4216fe8e4a2fdc69d51365b873ec53c926a9a1e575730cdb6d5f45eea5cd211c1cb2a21afd16cb75f3a1782411a2971eed7afe2f61708dfd
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,20 @@
|
|
1
|
+
## 0.35.1 - 2024-01-11
|
2
|
+
|
3
|
+
### Added
|
4
|
+
|
5
|
+
* [HexaPDF::Utils] module functions for float comparisons and using them instead
|
6
|
+
of the geom2d ones
|
7
|
+
|
8
|
+
### Changed
|
9
|
+
|
10
|
+
* Pre-defined paper sizes of the ISO A, B and C series to be more precise
|
11
|
+
|
12
|
+
### Fixed
|
13
|
+
|
14
|
+
* [HexaPDF::Layout::Box#fit] to use float comparison
|
15
|
+
* [HexaPDF::Type::IconFit] to use correct superclass
|
16
|
+
|
17
|
+
|
1
18
|
## 0.35.0 - 2024-01-06
|
2
19
|
|
3
20
|
### Added
|
data/lib/hexapdf/composer.rb
CHANGED
@@ -384,7 +384,8 @@ module HexaPDF
|
|
384
384
|
# composer.lorem_ipsum(sentences: 1, margin: [0, 0, 5])
|
385
385
|
# composer.list(item_spacing: 2) do |list|
|
386
386
|
# composer.document.config['layout.boxes.map'].each do |name, klass|
|
387
|
-
# list.formatted_text([{text: name.to_s, fill_color: "hp-blue-dark"}, "\n#{klass}"]
|
387
|
+
# list.formatted_text([{text: name.to_s, fill_color: "hp-blue-dark"}, "\n#{klass}"],
|
388
|
+
# font_size: 8)
|
388
389
|
# end
|
389
390
|
# end
|
390
391
|
#
|
@@ -118,7 +118,7 @@ module HexaPDF
|
|
118
118
|
# composer.list(item_spacing: 2) do |list|
|
119
119
|
# composer.document.config['layout.boxes.map'].each do |name, klass|
|
120
120
|
# list.formatted_text([{text: name.to_s, fill_color: "hp-blue-dark"},
|
121
|
-
# {text: "\n#{klass}", font_size: 7
|
121
|
+
# {text: "\n#{klass}"}, font_size: 7])
|
122
122
|
# end
|
123
123
|
# end
|
124
124
|
# end
|
@@ -62,8 +62,7 @@ module HexaPDF
|
|
62
62
|
# https://web.archive.org/web/20160310153722/https://www.w3.org/TR/SVG/implnote.html).
|
63
63
|
class EndpointArc
|
64
64
|
|
65
|
-
|
66
|
-
|
65
|
+
include Utils
|
67
66
|
include Utils::MathHelpers
|
68
67
|
|
69
68
|
# Creates and configures a new endpoint arc object.
|
@@ -283,7 +282,7 @@ module HexaPDF
|
|
283
282
|
|
284
283
|
# F.6.5.2
|
285
284
|
sqrt = (rxs * rys - rxs * y1ps - rys * x1ps) / (rxs * y1ps + rys * x1ps)
|
286
|
-
sqrt = 0 if sqrt.abs < EPSILON
|
285
|
+
sqrt = 0 if sqrt.abs < Utils::EPSILON
|
287
286
|
sqrt = Math.sqrt(sqrt)
|
288
287
|
sqrt *= -1 unless @large_arc == @clockwise
|
289
288
|
cxp = sqrt * rx * y1p / ry
|
@@ -303,11 +302,6 @@ module HexaPDF
|
|
303
302
|
inclination: @inclination, clockwise: @clockwise, max_curves: @max_curves}
|
304
303
|
end
|
305
304
|
|
306
|
-
# Compares two float numbers if they are within a certain delta.
|
307
|
-
def float_equal(a, b)
|
308
|
-
(a - b).abs < EPSILON
|
309
|
-
end
|
310
|
-
|
311
305
|
# Computes the angle in degrees between the x-axis and the vector.
|
312
306
|
def compute_angle_to_x_axis(vx, vy)
|
313
307
|
(vy < 0 ? -1 : 1) * rad_to_deg(Math.acos(vx / Math.sqrt(vx**2 + vy**2)))
|
data/lib/hexapdf/document.rb
CHANGED
data/lib/hexapdf/layout/box.rb
CHANGED
@@ -84,7 +84,7 @@ module HexaPDF
|
|
84
84
|
# which should just draw the content.
|
85
85
|
class Box
|
86
86
|
|
87
|
-
include
|
87
|
+
include HexaPDF::Utils
|
88
88
|
|
89
89
|
# Creates a new Box object, using the provided block as drawing block (see ::new).
|
90
90
|
#
|
@@ -194,7 +194,8 @@ module HexaPDF
|
|
194
194
|
def fit(available_width, available_height, _frame)
|
195
195
|
@width = (@initial_width > 0 ? @initial_width : available_width)
|
196
196
|
@height = (@initial_height > 0 ? @initial_height : available_height)
|
197
|
-
@fit_successful = (@width <=
|
197
|
+
@fit_successful = (float_compare(@width, available_width) <= 0 &&
|
198
|
+
float_compare(@height, available_height) <= 0)
|
198
199
|
end
|
199
200
|
|
200
201
|
# Tries to split the box into two, the first of which needs to fit into the current region of
|
data/lib/hexapdf/layout/frame.rb
CHANGED
@@ -42,7 +42,7 @@ module HexaPDF
|
|
42
42
|
# Utility class for generating width specifications for TextLayouter#fit from polygons.
|
43
43
|
class WidthFromPolygon
|
44
44
|
|
45
|
-
include
|
45
|
+
include HexaPDF::Utils
|
46
46
|
|
47
47
|
# Creates a new object for the given polygon (or polygon set) and immediately prepares it so
|
48
48
|
# that #call can be used.
|
@@ -34,7 +34,7 @@
|
|
34
34
|
# commercial licenses are available at <https://gettalong.at/hexapdf/>.
|
35
35
|
#++
|
36
36
|
|
37
|
-
require 'hexapdf/
|
37
|
+
require 'hexapdf/dictionary'
|
38
38
|
|
39
39
|
module HexaPDF
|
40
40
|
module Type
|
@@ -43,7 +43,7 @@ module HexaPDF
|
|
43
43
|
# rectangle.
|
44
44
|
#
|
45
45
|
# See: PDF2.0 s12.7.8.3.2
|
46
|
-
class IconFit <
|
46
|
+
class IconFit < Dictionary
|
47
47
|
|
48
48
|
define_type :XXIconFit
|
49
49
|
|
data/lib/hexapdf/type/page.rb
CHANGED
@@ -62,41 +62,41 @@ module HexaPDF
|
|
62
62
|
# * ISO sizes: A0x4, A0x2, A0-A10, B0-B10, C0-C10
|
63
63
|
# * Letter, Legal, Ledger, Tabloid, Executive
|
64
64
|
PAPER_SIZE = {
|
65
|
-
A0x4: [0, 0,
|
66
|
-
A0x2: [0, 0, 3370,
|
67
|
-
A0: [0, 0,
|
68
|
-
A1: [0, 0,
|
69
|
-
A2: [0, 0,
|
70
|
-
A3: [0, 0,
|
71
|
-
A4: [0, 0, 595,
|
72
|
-
A5: [0, 0,
|
73
|
-
A6: [0, 0,
|
74
|
-
A7: [0, 0,
|
75
|
-
A8: [0, 0, 147,
|
76
|
-
A9: [0, 0,
|
77
|
-
A10: [0, 0,
|
78
|
-
B0: [0, 0,
|
79
|
-
B1: [0, 0, 2004,
|
80
|
-
B2: [0, 0, 1417, 2004].freeze,
|
81
|
-
B3: [0, 0,
|
82
|
-
B4: [0, 0,
|
83
|
-
B5: [0, 0,
|
84
|
-
B6: [0, 0, 354,
|
85
|
-
B7: [0, 0, 249, 354].freeze,
|
86
|
-
B8: [0, 0,
|
87
|
-
B9: [0, 0,
|
88
|
-
B10: [0, 0,
|
89
|
-
C0: [0, 0, 2599,
|
90
|
-
C1: [0, 0,
|
91
|
-
C2: [0, 0, 1298,
|
92
|
-
C3: [0, 0, 918, 1298].freeze,
|
93
|
-
C4: [0, 0, 649, 918].freeze,
|
94
|
-
C5: [0, 0, 459, 649].freeze,
|
95
|
-
C6: [0, 0, 323, 459].freeze,
|
96
|
-
C7: [0, 0,
|
97
|
-
C8: [0, 0,
|
98
|
-
C9: [0, 0, 113,
|
99
|
-
C10: [0, 0, 79, 113].freeze,
|
65
|
+
A0x4: [0, 0, 4767.874016, 6740.787402].freeze,
|
66
|
+
A0x2: [0, 0, 3370.393701, 4767.874016].freeze,
|
67
|
+
A0: [0, 0, 2383.937008, 3370.393701].freeze,
|
68
|
+
A1: [0, 0, 1683.779528, 2383.937008].freeze,
|
69
|
+
A2: [0, 0, 1190.551181, 1683.779528].freeze,
|
70
|
+
A3: [0, 0, 841.889764, 1190.551181].freeze,
|
71
|
+
A4: [0, 0, 595.275591, 841.889764].freeze,
|
72
|
+
A5: [0, 0, 419.527559, 595.275591].freeze,
|
73
|
+
A6: [0, 0, 297.637795, 419.527559].freeze,
|
74
|
+
A7: [0, 0, 209.76378, 297.637795].freeze,
|
75
|
+
A8: [0, 0, 147.401575, 209.76378].freeze,
|
76
|
+
A9: [0, 0, 104.88189, 147.401575].freeze,
|
77
|
+
A10: [0, 0, 73.700787, 104.88189].freeze,
|
78
|
+
B0: [0, 0, 2834.645669, 4008.188976].freeze,
|
79
|
+
B1: [0, 0, 2004.094488, 2834.645669].freeze,
|
80
|
+
B2: [0, 0, 1417.322835, 2004.094488].freeze,
|
81
|
+
B3: [0, 0, 1000.629921, 1417.322835].freeze,
|
82
|
+
B4: [0, 0, 708.661417, 1000.629921].freeze,
|
83
|
+
B5: [0, 0, 498.897638, 708.661417].freeze,
|
84
|
+
B6: [0, 0, 354.330709, 498.897638].freeze,
|
85
|
+
B7: [0, 0, 249.448819, 354.330709].freeze,
|
86
|
+
B8: [0, 0, 175.748031, 249.448819].freeze,
|
87
|
+
B9: [0, 0, 124.724409, 175.748031].freeze,
|
88
|
+
B10: [0, 0, 87.874016, 124.724409].freeze,
|
89
|
+
C0: [0, 0, 2599.370079, 3676.535433].freeze,
|
90
|
+
C1: [0, 0, 1836.850394, 2599.370079].freeze,
|
91
|
+
C2: [0, 0, 1298.267717, 1836.850394].freeze,
|
92
|
+
C3: [0, 0, 918.425197, 1298.267717].freeze,
|
93
|
+
C4: [0, 0, 649.133858, 918.425197].freeze,
|
94
|
+
C5: [0, 0, 459.212598, 649.133858].freeze,
|
95
|
+
C6: [0, 0, 323.149606, 459.212598].freeze,
|
96
|
+
C7: [0, 0, 229.606299, 323.149606].freeze,
|
97
|
+
C8: [0, 0, 161.574803, 229.606299].freeze,
|
98
|
+
C9: [0, 0, 113.385827, 161.574803].freeze,
|
99
|
+
C10: [0, 0, 79.370079, 113.385827].freeze,
|
100
100
|
Letter: [0, 0, 612, 792].freeze,
|
101
101
|
Legal: [0, 0, 612, 1008].freeze,
|
102
102
|
Ledger: [0, 0, 792, 1224].freeze,
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8; frozen_string_literal: true -*-
|
2
|
+
#
|
3
|
+
#--
|
4
|
+
# This file is part of HexaPDF.
|
5
|
+
#
|
6
|
+
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
7
|
+
# Copyright (C) 2014-2023 Thomas Leitner
|
8
|
+
#
|
9
|
+
# HexaPDF is free software: you can redistribute it and/or modify it
|
10
|
+
# under the terms of the GNU Affero General Public License version 3 as
|
11
|
+
# published by the Free Software Foundation with the addition of the
|
12
|
+
# following permission added to Section 15 as permitted in Section 7(a):
|
13
|
+
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
|
14
|
+
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
|
15
|
+
# INFRINGEMENT OF THIRD PARTY RIGHTS.
|
16
|
+
#
|
17
|
+
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
|
18
|
+
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
19
|
+
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
|
20
|
+
# License for more details.
|
21
|
+
#
|
22
|
+
# You should have received a copy of the GNU Affero General Public License
|
23
|
+
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
|
24
|
+
#
|
25
|
+
# The interactive user interfaces in modified source and object code
|
26
|
+
# versions of HexaPDF must display Appropriate Legal Notices, as required
|
27
|
+
# under Section 5 of the GNU Affero General Public License version 3.
|
28
|
+
#
|
29
|
+
# In accordance with Section 7(b) of the GNU Affero General Public
|
30
|
+
# License, a covered work must retain the producer line in every PDF that
|
31
|
+
# is created or manipulated using HexaPDF.
|
32
|
+
#
|
33
|
+
# If the GNU Affero General Public License doesn't fit your need,
|
34
|
+
# commercial licenses are available at <https://gettalong.at/hexapdf/>.
|
35
|
+
#++
|
36
|
+
|
37
|
+
require 'geom2d/utils'
|
38
|
+
|
39
|
+
module HexaPDF
|
40
|
+
module Utils
|
41
|
+
|
42
|
+
# The precision with which to compare floating point numbers.
|
43
|
+
#
|
44
|
+
# This is chosen with respect to precision that is used for serializing floating point numbers.
|
45
|
+
EPSILON = 1e-6
|
46
|
+
|
47
|
+
# Best effort of setting Geom2D's precision to the one used by HexaPDF.
|
48
|
+
::Geom2D::Utils.precision = EPSILON
|
49
|
+
|
50
|
+
module_function
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
# Compares two floats whether they are equal using the FLOAT_EPSILON precision.
|
55
|
+
def float_equal(a, b)
|
56
|
+
(a - b).abs < EPSILON
|
57
|
+
end
|
58
|
+
|
59
|
+
# Compares two floats like the <=> operator but using the FLOAT_EPSILON precision for detecting
|
60
|
+
# whether they are equal.
|
61
|
+
def float_compare(a, b)
|
62
|
+
(a - b).abs < EPSILON ? 0 : a <=> b
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
data/lib/hexapdf/version.rb
CHANGED
@@ -39,7 +39,7 @@ describe HexaPDF::Content::CanvasComposer do
|
|
39
39
|
@composer.draw_box(create_box)
|
40
40
|
assert_operators(@composer.canvas.contents,
|
41
41
|
[[:save_graphics_state],
|
42
|
-
[:concatenate_matrix, [1, 0, 0, 1, 0,
|
42
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, 741.889764]],
|
43
43
|
[:restore_graphics_state],
|
44
44
|
[:save_graphics_state],
|
45
45
|
[:concatenate_matrix, [1, 0, 0, 1, 0, 0]],
|
@@ -58,10 +58,10 @@ describe HexaPDF::Content::CanvasComposer do
|
|
58
58
|
[:concatenate_matrix, [1, 0, 0, 1, 0, 0]],
|
59
59
|
[:restore_graphics_state],
|
60
60
|
[:save_graphics_state],
|
61
|
-
[:concatenate_matrix, [1, 0, 0, 1, 400,
|
61
|
+
[:concatenate_matrix, [1, 0, 0, 1, 400, 741.889764]],
|
62
62
|
[:restore_graphics_state],
|
63
63
|
[:save_graphics_state],
|
64
|
-
[:concatenate_matrix, [1, 0, 0, 1, 400,
|
64
|
+
[:concatenate_matrix, [1, 0, 0, 1, 400, 641.889764]],
|
65
65
|
[:restore_graphics_state]])
|
66
66
|
end
|
67
67
|
|
@@ -70,10 +70,10 @@ describe HexaPDF::Content::CanvasComposer do
|
|
70
70
|
@composer.draw_box(create_box(width: 400, height: 100))
|
71
71
|
assert_operators(@composer.canvas.contents,
|
72
72
|
[[:save_graphics_state],
|
73
|
-
[:concatenate_matrix, [1, 0, 0, 1, 0,
|
73
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, 741.889764]],
|
74
74
|
[:restore_graphics_state],
|
75
75
|
[:save_graphics_state],
|
76
|
-
[:concatenate_matrix, [1, 0, 0, 1, 0,
|
76
|
+
[:concatenate_matrix, [1, 0, 0, 1, 0, 641.889764]],
|
77
77
|
[:restore_graphics_state]])
|
78
78
|
end
|
79
79
|
|
@@ -17,20 +17,20 @@ describe HexaPDF::Document::Pages do
|
|
17
17
|
describe "create" do
|
18
18
|
it "uses the defaults from the configuration for missing arguments" do
|
19
19
|
page = @doc.pages.create
|
20
|
-
assert_equal([0, 0, 595,
|
20
|
+
assert_equal([0, 0, 595.275591, 841.889764], page.box(:media).value)
|
21
21
|
end
|
22
22
|
|
23
23
|
it "allows specifying a reference to a predefined page size" do
|
24
24
|
page = @doc.pages.create(media_box: :A3)
|
25
|
-
assert_equal([0, 0,
|
25
|
+
assert_equal([0, 0, 841.889764, 1190.551181], page.box(:media).value)
|
26
26
|
end
|
27
27
|
|
28
28
|
it "allows specifying the orientation for a predefined page size" do
|
29
29
|
page = @doc.pages.create(media_box: :A4, orientation: :landscape)
|
30
|
-
assert_equal([0, 0,
|
30
|
+
assert_equal([0, 0, 841.889764, 595.275591], page.box(:media).value)
|
31
31
|
|
32
32
|
page = @doc.pages.create(orientation: :landscape)
|
33
|
-
assert_equal([0, 0,
|
33
|
+
assert_equal([0, 0, 841.889764, 595.275591], page.box(:media).value)
|
34
34
|
end
|
35
35
|
|
36
36
|
it "allows using a media box array" do
|
@@ -54,7 +54,7 @@ describe HexaPDF::Document::Pages do
|
|
54
54
|
it "adds a new empty page with the given page format" do
|
55
55
|
page = @doc.pages.add(:A4, orientation: :landscape)
|
56
56
|
assert_same(page, @doc.pages[0])
|
57
|
-
assert_equal([0, 0,
|
57
|
+
assert_equal([0, 0, 841.889764, 595.275591], @doc.pages[0].box(:media).value)
|
58
58
|
end
|
59
59
|
|
60
60
|
it "adds the given page to the end" do
|
@@ -95,6 +95,13 @@ describe HexaPDF::Layout::Box do
|
|
95
95
|
assert_equal(100, box.height)
|
96
96
|
end
|
97
97
|
|
98
|
+
it "uses float comparison" do
|
99
|
+
box = create_box(width: 50.0000002, height: 49.9999996)
|
100
|
+
assert(box.fit(50, 50, @frame))
|
101
|
+
assert_equal(50.0000002, box.width)
|
102
|
+
assert_equal(49.9999996, box.height)
|
103
|
+
end
|
104
|
+
|
98
105
|
it "returns false if the box doesn't fit" do
|
99
106
|
box = create_box(width: 101)
|
100
107
|
refute(box.fit(100, 100, @frame))
|
@@ -192,19 +192,19 @@ describe HexaPDF::Layout::ColumnBox do
|
|
192
192
|
end
|
193
193
|
|
194
194
|
it "takes a different final location into account" do
|
195
|
-
box = create_box(children: @fixed_size_boxes[0, 2])
|
195
|
+
box = create_box(children: @fixed_size_boxes[0, 2], style: {padding: [2, 4, 6, 8]})
|
196
196
|
box.fit(100, 100, @frame)
|
197
197
|
box.draw(@canvas, 20, 10)
|
198
198
|
operators = [
|
199
199
|
[:save_graphics_state],
|
200
|
-
[:concatenate_matrix, [1, 0, 0, 1, 20, -
|
200
|
+
[:concatenate_matrix, [1, 0, 0, 1, 20, -72]],
|
201
201
|
[:save_graphics_state],
|
202
|
-
[:concatenate_matrix, [1, 0, 0, 1,
|
202
|
+
[:concatenate_matrix, [1, 0, 0, 1, 8, 88]],
|
203
203
|
[:move_to, [0, 0]],
|
204
204
|
[:end_path],
|
205
205
|
[:restore_graphics_state],
|
206
206
|
[:save_graphics_state],
|
207
|
-
[:concatenate_matrix, [1, 0, 0, 1,
|
207
|
+
[:concatenate_matrix, [1, 0, 0, 1, 57, 88]],
|
208
208
|
[:move_to, [0, 0]],
|
209
209
|
[:end_path],
|
210
210
|
[:restore_graphics_state],
|
@@ -35,7 +35,7 @@ describe HexaPDF::Layout::PageStyle do
|
|
35
35
|
istyle.next_style = :other
|
36
36
|
end
|
37
37
|
page = style.create_page(@doc)
|
38
|
-
assert_equal([0, 0, 595,
|
38
|
+
assert_equal([0, 0, 595.275591, 841.889764], page.box(:media))
|
39
39
|
assert_equal("0 0 10 10 re\nS\n", page.contents)
|
40
40
|
assert_equal(:frame, style.frame)
|
41
41
|
assert_equal(:other, style.next_style)
|
@@ -54,8 +54,8 @@ describe HexaPDF::Layout::PageStyle do
|
|
54
54
|
assert_kind_of(HexaPDF::Layout::Frame, style.frame)
|
55
55
|
assert_equal(36, style.frame.left)
|
56
56
|
assert_equal(36, style.frame.bottom)
|
57
|
-
assert_equal(523, style.frame.width)
|
58
|
-
assert_equal(
|
57
|
+
assert_equal(523.275591, style.frame.width)
|
58
|
+
assert_equal(769.889764, style.frame.height)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -65,7 +65,7 @@ describe HexaPDF::Layout::PageStyle do
|
|
65
65
|
frame = style.create_frame(style.create_page(doc), [15, 10])
|
66
66
|
assert_equal(10, frame.left)
|
67
67
|
assert_equal(15, frame.bottom)
|
68
|
-
assert_equal(575, frame.width)
|
69
|
-
assert_equal(
|
68
|
+
assert_equal(575.275591, frame.width)
|
69
|
+
assert_equal(811.889764, frame.height)
|
70
70
|
end
|
71
71
|
end
|
@@ -16,8 +16,8 @@ describe HexaPDF::Composer do
|
|
16
16
|
assert_kind_of(HexaPDF::Type::Page, @composer.page)
|
17
17
|
assert_equal(36, @composer.frame.left)
|
18
18
|
assert_equal(36, @composer.frame.bottom)
|
19
|
-
assert_equal(523, @composer.frame.width)
|
20
|
-
assert_equal(
|
19
|
+
assert_equal(523.275591, @composer.frame.width)
|
20
|
+
assert_equal(769.889764, @composer.frame.height)
|
21
21
|
assert_kind_of(HexaPDF::Layout::Style, @composer.style(:base))
|
22
22
|
end
|
23
23
|
|
@@ -28,15 +28,15 @@ describe HexaPDF::Composer do
|
|
28
28
|
|
29
29
|
it "allows the customization of the page orientation" do
|
30
30
|
composer = HexaPDF::Composer.new(page_orientation: :landscape)
|
31
|
-
assert_equal([0, 0,
|
31
|
+
assert_equal([0, 0, 841.889764, 595.275591], composer.page.box.value)
|
32
32
|
end
|
33
33
|
|
34
34
|
it "allows the customization of the margin" do
|
35
35
|
composer = HexaPDF::Composer.new(margin: [100, 80, 60, 40])
|
36
36
|
assert_equal(40, composer.frame.left)
|
37
37
|
assert_equal(60, composer.frame.bottom)
|
38
|
-
|
39
|
-
assert_equal(
|
38
|
+
assert_in_delta(475.275591, composer.frame.width)
|
39
|
+
assert_equal(681.889764, composer.frame.height)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "allows skipping the initial page creation" do
|
@@ -107,7 +107,7 @@ describe HexaPDF::Composer do
|
|
107
107
|
end
|
108
108
|
|
109
109
|
it "returns the current y-position" do
|
110
|
-
assert_equal(
|
110
|
+
assert_equal(805.889764, @composer.y)
|
111
111
|
end
|
112
112
|
|
113
113
|
describe "style" do
|
@@ -203,7 +203,7 @@ describe HexaPDF::Composer do
|
|
203
203
|
@composer.draw_box(create_box)
|
204
204
|
assert_operators(@composer.canvas.contents,
|
205
205
|
[[:save_graphics_state],
|
206
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
206
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 705.889764]],
|
207
207
|
[:restore_graphics_state],
|
208
208
|
[:save_graphics_state],
|
209
209
|
[:concatenate_matrix, [1, 0, 0, 1, 36, 36]],
|
@@ -232,14 +232,14 @@ describe HexaPDF::Composer do
|
|
232
232
|
@composer.draw_box(box)
|
233
233
|
assert_operators(first_page_contents,
|
234
234
|
[[:save_graphics_state],
|
235
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
235
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 405.889764]],
|
236
236
|
[:restore_graphics_state],
|
237
237
|
[:save_graphics_state],
|
238
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
238
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 5.889764]],
|
239
239
|
[:restore_graphics_state]])
|
240
240
|
assert_operators(@composer.canvas.contents,
|
241
241
|
[[:save_graphics_state],
|
242
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
242
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 705.889764]],
|
243
243
|
[:restore_graphics_state]])
|
244
244
|
end
|
245
245
|
|
@@ -252,14 +252,14 @@ describe HexaPDF::Composer do
|
|
252
252
|
@composer.draw_box(box)
|
253
253
|
assert_operators(first_page_contents,
|
254
254
|
[[:save_graphics_state],
|
255
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
255
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 405.889764]],
|
256
256
|
[:restore_graphics_state],
|
257
257
|
[:save_graphics_state],
|
258
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
258
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 305.889764]],
|
259
259
|
[:restore_graphics_state]])
|
260
260
|
assert_operators(@composer.canvas.contents,
|
261
261
|
[[:save_graphics_state],
|
262
|
-
[:concatenate_matrix, [1, 0, 0, 1, 36,
|
262
|
+
[:concatenate_matrix, [1, 0, 0, 1, 36, 405.889764]],
|
263
263
|
[:restore_graphics_state]])
|
264
264
|
end
|
265
265
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'test_helper'
|
4
|
+
require 'hexapdf/utils.rb'
|
5
|
+
|
6
|
+
describe HexaPDF::Utils do
|
7
|
+
include HexaPDF::Utils
|
8
|
+
|
9
|
+
it "checks floats for equality with a certain precision" do
|
10
|
+
assert(float_equal(1.0, 1))
|
11
|
+
assert(float_equal(1.0, 1.0000003))
|
12
|
+
end
|
13
|
+
|
14
|
+
it "compares floats like the <=> operator" do
|
15
|
+
assert_equal(0, float_compare(1.0, 1))
|
16
|
+
assert_equal(0, float_compare(1.0, 1.0000003))
|
17
|
+
assert_equal(-1, float_compare(1.0, 1.03))
|
18
|
+
assert_equal(1, float_compare(1.0, 0.9997))
|
19
|
+
end
|
20
|
+
end
|
data/test/hexapdf/test_writer.rb
CHANGED
@@ -40,7 +40,7 @@ describe HexaPDF::Writer do
|
|
40
40
|
219
|
41
41
|
%%EOF
|
42
42
|
3 0 obj
|
43
|
-
<</Producer(HexaPDF version 0.35.
|
43
|
+
<</Producer(HexaPDF version 0.35.1)>>
|
44
44
|
endobj
|
45
45
|
xref
|
46
46
|
3 1
|
@@ -72,7 +72,7 @@ describe HexaPDF::Writer do
|
|
72
72
|
141
|
73
73
|
%%EOF
|
74
74
|
6 0 obj
|
75
|
-
<</Producer(HexaPDF version 0.35.
|
75
|
+
<</Producer(HexaPDF version 0.35.1)>>
|
76
76
|
endobj
|
77
77
|
2 0 obj
|
78
78
|
<</Length 10>>stream
|
@@ -214,7 +214,7 @@ describe HexaPDF::Writer do
|
|
214
214
|
<</Type/Page/MediaBox[0 0 595 842]/Parent 2 0 R/Resources<<>>>>
|
215
215
|
endobj
|
216
216
|
5 0 obj
|
217
|
-
<</Producer(HexaPDF version 0.35.
|
217
|
+
<</Producer(HexaPDF version 0.35.1)>>
|
218
218
|
endobj
|
219
219
|
4 0 obj
|
220
220
|
<</Root 1 0 R/Info 5 0 R/Size 6/Type/XRef/W[1 1 2]/Index[0 6]/Filter/FlateDecode/DecodeParms<</Columns 4/Predictor 12>>/Length 33>>stream
|
@@ -12,11 +12,11 @@ describe HexaPDF::Type::Page do
|
|
12
12
|
|
13
13
|
describe "::media_box" do
|
14
14
|
it "returns the media box for a given paper size" do
|
15
|
-
assert_equal([0, 0, 595,
|
15
|
+
assert_equal([0, 0, 595.275591, 841.889764], HexaPDF::Type::Page.media_box(:A4))
|
16
16
|
end
|
17
17
|
|
18
18
|
it "respects the orientation key" do
|
19
|
-
assert_equal([0, 0,
|
19
|
+
assert_equal([0, 0, 841.889764, 595.275591], HexaPDF::Type::Page.media_box(:A4, orientation: :landscape))
|
20
20
|
end
|
21
21
|
|
22
22
|
it "works with a paper size array" do
|
@@ -116,7 +116,7 @@ describe HexaPDF::Type::Page do
|
|
116
116
|
page1[:MediaBox] = [0, 0, 1, 1]
|
117
117
|
refute(page2.validate(auto_correct: false))
|
118
118
|
assert(page2.validate)
|
119
|
-
assert_equal([0, 0, 595,
|
119
|
+
assert_equal([0, 0, 595.275591, 841.889764], page2[:MediaBox])
|
120
120
|
end
|
121
121
|
end
|
122
122
|
|
@@ -89,7 +89,7 @@ describe HexaPDF::Type::PageTreeNode do
|
|
89
89
|
assert_equal(:Page, page[:Type])
|
90
90
|
assert_equal(@root, page[:Parent])
|
91
91
|
assert_kind_of(HexaPDF::Rectangle, page[:MediaBox])
|
92
|
-
assert_equal([0, 0,
|
92
|
+
assert_equal([0, 0, 841.889764, 595.275591], page[:MediaBox].value)
|
93
93
|
assert_equal({}, page[:Resources].value)
|
94
94
|
refute(@root.value.key?(:Parent))
|
95
95
|
end
|
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.35.
|
4
|
+
version: 0.35.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-01-
|
11
|
+
date: 2024-01-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cmdparse
|
@@ -519,6 +519,7 @@ files:
|
|
519
519
|
- lib/hexapdf/type/trailer.rb
|
520
520
|
- lib/hexapdf/type/viewer_preferences.rb
|
521
521
|
- lib/hexapdf/type/xref_stream.rb
|
522
|
+
- lib/hexapdf/utils.rb
|
522
523
|
- lib/hexapdf/utils/bit_field.rb
|
523
524
|
- lib/hexapdf/utils/bit_stream.rb
|
524
525
|
- lib/hexapdf/utils/graphics_helpers.rb
|
@@ -728,6 +729,7 @@ files:
|
|
728
729
|
- test/hexapdf/test_stream.rb
|
729
730
|
- test/hexapdf/test_tokenizer.rb
|
730
731
|
- test/hexapdf/test_type.rb
|
732
|
+
- test/hexapdf/test_utils.rb
|
731
733
|
- test/hexapdf/test_writer.rb
|
732
734
|
- test/hexapdf/test_xref_section.rb
|
733
735
|
- test/hexapdf/type/acro_form/test_appearance_generator.rb
|