hexapdf 0.35.0 → 0.35.1
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 +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
|