hexapdf 0.5.0 → 0.6.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 +76 -2
- data/CONTRIBUTERS +1 -1
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/examples/boxes.rb +68 -0
- data/examples/graphics.rb +12 -12
- data/examples/{text_box_alignment.rb → text_layouter_alignment.rb} +14 -14
- data/examples/text_layouter_inline_boxes.rb +66 -0
- data/examples/{text_box_line_wrapping.rb → text_layouter_line_wrapping.rb} +9 -10
- data/examples/{text_box_shapes.rb → text_layouter_shapes.rb} +58 -54
- data/examples/text_layouter_styling.rb +125 -0
- data/examples/truetype.rb +5 -7
- data/lib/hexapdf/cli/command.rb +1 -0
- data/lib/hexapdf/configuration.rb +170 -106
- data/lib/hexapdf/content/canvas.rb +41 -36
- data/lib/hexapdf/content/graphics_state.rb +15 -0
- data/lib/hexapdf/content/operator.rb +1 -1
- data/lib/hexapdf/dictionary.rb +20 -8
- data/lib/hexapdf/dictionary_fields.rb +8 -6
- data/lib/hexapdf/document.rb +25 -26
- data/lib/hexapdf/document/fonts.rb +4 -4
- data/lib/hexapdf/document/images.rb +2 -2
- data/lib/hexapdf/document/pages.rb +16 -16
- data/lib/hexapdf/encryption/security_handler.rb +41 -9
- data/lib/hexapdf/filter/flate_decode.rb +1 -1
- data/lib/hexapdf/filter/lzw_decode.rb +1 -1
- data/lib/hexapdf/filter/predictor.rb +7 -1
- data/lib/hexapdf/font/true_type/font.rb +20 -0
- data/lib/hexapdf/font/type1/font.rb +23 -0
- data/lib/hexapdf/font_loader.rb +1 -0
- data/lib/hexapdf/font_loader/from_configuration.rb +2 -3
- data/lib/hexapdf/font_loader/from_file.rb +65 -0
- data/lib/hexapdf/image_loader/png.rb +2 -2
- data/lib/hexapdf/layout.rb +3 -2
- data/lib/hexapdf/layout/box.rb +146 -0
- data/lib/hexapdf/layout/inline_box.rb +40 -31
- data/lib/hexapdf/layout/{line_fragment.rb → line.rb} +12 -13
- data/lib/hexapdf/layout/style.rb +630 -41
- data/lib/hexapdf/layout/text_fragment.rb +80 -12
- data/lib/hexapdf/layout/{text_box.rb → text_layouter.rb} +164 -109
- data/lib/hexapdf/number_tree_node.rb +1 -1
- data/lib/hexapdf/parser.rb +4 -1
- data/lib/hexapdf/revisions.rb +11 -4
- data/lib/hexapdf/stream.rb +8 -9
- data/lib/hexapdf/tokenizer.rb +5 -3
- data/lib/hexapdf/type.rb +3 -0
- data/lib/hexapdf/type/action.rb +56 -0
- data/lib/hexapdf/type/actions.rb +52 -0
- data/lib/hexapdf/type/actions/go_to.rb +52 -0
- data/lib/hexapdf/type/actions/go_to_r.rb +54 -0
- data/lib/hexapdf/type/actions/launch.rb +73 -0
- data/lib/hexapdf/type/actions/uri.rb +65 -0
- data/lib/hexapdf/type/annotation.rb +85 -0
- data/lib/hexapdf/type/annotations.rb +51 -0
- data/lib/hexapdf/type/annotations/link.rb +70 -0
- data/lib/hexapdf/type/annotations/markup_annotation.rb +70 -0
- data/lib/hexapdf/type/annotations/text.rb +81 -0
- data/lib/hexapdf/type/catalog.rb +3 -1
- data/lib/hexapdf/type/embedded_file.rb +6 -11
- data/lib/hexapdf/type/file_specification.rb +4 -6
- data/lib/hexapdf/type/font.rb +3 -1
- data/lib/hexapdf/type/font_descriptor.rb +18 -16
- data/lib/hexapdf/type/form.rb +3 -1
- data/lib/hexapdf/type/graphics_state_parameter.rb +3 -1
- data/lib/hexapdf/type/image.rb +4 -2
- data/lib/hexapdf/type/info.rb +2 -5
- data/lib/hexapdf/type/names.rb +2 -5
- data/lib/hexapdf/type/object_stream.rb +2 -1
- data/lib/hexapdf/type/page.rb +14 -1
- data/lib/hexapdf/type/page_tree_node.rb +9 -6
- data/lib/hexapdf/type/resources.rb +2 -5
- data/lib/hexapdf/type/trailer.rb +2 -5
- data/lib/hexapdf/type/viewer_preferences.rb +2 -5
- data/lib/hexapdf/type/xref_stream.rb +3 -1
- data/lib/hexapdf/version.rb +1 -1
- data/test/hexapdf/common_tokenizer_tests.rb +3 -1
- data/test/hexapdf/content/test_canvas.rb +29 -3
- data/test/hexapdf/content/test_graphics_state.rb +11 -0
- data/test/hexapdf/content/test_operator.rb +3 -2
- data/test/hexapdf/document/test_fonts.rb +8 -8
- data/test/hexapdf/document/test_images.rb +4 -12
- data/test/hexapdf/document/test_pages.rb +7 -7
- data/test/hexapdf/encryption/test_security_handler.rb +1 -5
- data/test/hexapdf/filter/test_predictor.rb +40 -12
- data/test/hexapdf/font/true_type/test_font.rb +16 -0
- data/test/hexapdf/font/type1/test_font.rb +30 -0
- data/test/hexapdf/font_loader/test_from_file.rb +29 -0
- data/test/hexapdf/font_loader/test_standard14.rb +4 -3
- data/test/hexapdf/layout/test_box.rb +104 -0
- data/test/hexapdf/layout/test_inline_box.rb +24 -10
- data/test/hexapdf/layout/{test_line_fragment.rb → test_line.rb} +9 -9
- data/test/hexapdf/layout/test_style.rb +519 -31
- data/test/hexapdf/layout/test_text_fragment.rb +136 -15
- data/test/hexapdf/layout/{test_text_box.rb → test_text_layouter.rb} +224 -144
- data/test/hexapdf/layout/test_text_shaper.rb +1 -1
- data/test/hexapdf/test_configuration.rb +12 -6
- data/test/hexapdf/test_dictionary.rb +27 -2
- data/test/hexapdf/test_dictionary_fields.rb +10 -1
- data/test/hexapdf/test_document.rb +14 -13
- data/test/hexapdf/test_parser.rb +12 -0
- data/test/hexapdf/test_revisions.rb +34 -0
- data/test/hexapdf/test_stream.rb +1 -1
- data/test/hexapdf/test_type.rb +18 -0
- data/test/hexapdf/test_writer.rb +2 -2
- data/test/hexapdf/type/actions/test_launch.rb +24 -0
- data/test/hexapdf/type/actions/test_uri.rb +23 -0
- data/test/hexapdf/type/annotations/test_link.rb +19 -0
- data/test/hexapdf/type/annotations/test_markup_annotation.rb +22 -0
- data/test/hexapdf/type/annotations/test_text.rb +38 -0
- data/test/hexapdf/type/test_annotation.rb +38 -0
- data/test/hexapdf/type/test_file_specification.rb +0 -7
- data/test/hexapdf/type/test_info.rb +0 -5
- data/test/hexapdf/type/test_page.rb +14 -0
- data/test/hexapdf/type/test_page_tree_node.rb +4 -1
- data/test/hexapdf/type/test_trailer.rb +0 -4
- data/test/test_helper.rb +6 -3
- metadata +36 -15
- data/examples/text_box_inline_boxes.rb +0 -56
- data/examples/text_box_styling.rb +0 -72
- data/test/hexapdf/type/test_embedded_file.rb +0 -16
- data/test/hexapdf/type/test_names.rb +0 -9
|
@@ -6,13 +6,6 @@ require 'stringio'
|
|
|
6
6
|
require 'hexapdf/type/file_specification'
|
|
7
7
|
require 'hexapdf/document'
|
|
8
8
|
|
|
9
|
-
describe HexaPDF::Type::FileSpecification::EFDictionary do
|
|
10
|
-
it "uses a custom type" do
|
|
11
|
-
obj = HexaPDF::Type::FileSpecification::EFDictionary.new({})
|
|
12
|
-
assert_equal(:XXFilespecEFDictionary, obj.type)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
|
|
16
9
|
describe HexaPDF::Type::FileSpecification do
|
|
17
10
|
before do
|
|
18
11
|
@doc = HexaPDF::Document.new
|
|
@@ -11,6 +11,20 @@ describe HexaPDF::Type::Page do
|
|
|
11
11
|
@doc = HexaPDF::Document.new
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
+
describe "::media_box" do
|
|
15
|
+
it "returns the media box for a given paper size" do
|
|
16
|
+
assert_equal([0, 0, 595, 842], HexaPDF::Type::Page.media_box(:A4))
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "respects the orientation key" do
|
|
20
|
+
assert_equal([0, 0, 842, 595], HexaPDF::Type::Page.media_box(:A4, orientation: :landscape))
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
it "fails if the paper size is unknown" do
|
|
24
|
+
assert_raises(HexaPDF::Error) { HexaPDF::Type::Page.media_box(:Unknown) }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
14
28
|
# Asserts that the page's contents contains the operators.
|
|
15
29
|
def assert_operators(page, operators)
|
|
16
30
|
processor = TestHelper::OperatorRecorder.new
|
|
@@ -80,13 +80,16 @@ describe HexaPDF::Type::PageTreeNode do
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
describe "insert_page" do
|
|
83
|
-
it "uses an empty new page when none is provided" do
|
|
83
|
+
it "uses an empty new page when none is provided, respecting the set configuration options" do
|
|
84
|
+
@doc.config['page.default_media_box'] = :A4
|
|
85
|
+
@doc.config['page.default_media_orientation'] = :landscape
|
|
84
86
|
page = @root.insert_page(3)
|
|
85
87
|
assert_equal([page], @root[:Kids])
|
|
86
88
|
assert_equal(1, @root.page_count)
|
|
87
89
|
assert_equal(:Page, page[:Type])
|
|
88
90
|
assert_equal(@root, page[:Parent])
|
|
89
91
|
assert_kind_of(HexaPDF::Rectangle, page[:MediaBox])
|
|
92
|
+
assert_equal([0, 0, 842, 595], page[:MediaBox].value)
|
|
90
93
|
assert_equal({}, page[:Resources].value)
|
|
91
94
|
refute(@root.value.key?(:Parent))
|
|
92
95
|
end
|
|
@@ -16,10 +16,6 @@ describe HexaPDF::Type::Trailer do
|
|
|
16
16
|
@obj = HexaPDF::Type::Trailer.new({Size: 10, Root: root}, document: @doc)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
it "uses a custom type" do
|
|
20
|
-
assert_equal(:XXTrailer, @obj.type)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
19
|
it "returns the catalog object, creating it if needed" do
|
|
24
20
|
doc = Minitest::Mock.new
|
|
25
21
|
doc.expect(:add, :val, [{Type: :Catalog}])
|
data/test/test_helper.rb
CHANGED
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.6.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-10-27 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: cmdparse
|
|
@@ -155,6 +155,7 @@ files:
|
|
|
155
155
|
- data/hexapdf/encoding/glyphlist.txt
|
|
156
156
|
- data/hexapdf/encoding/zapfdingbats.txt
|
|
157
157
|
- examples/arc.rb
|
|
158
|
+
- examples/boxes.rb
|
|
158
159
|
- examples/emoji-smile.png
|
|
159
160
|
- examples/emoji-wink.png
|
|
160
161
|
- examples/graphics.rb
|
|
@@ -164,11 +165,11 @@ files:
|
|
|
164
165
|
- examples/optimizing.rb
|
|
165
166
|
- examples/show_char_bboxes.rb
|
|
166
167
|
- examples/standard_pdf_fonts.rb
|
|
167
|
-
- examples/
|
|
168
|
-
- examples/
|
|
169
|
-
- examples/
|
|
170
|
-
- examples/
|
|
171
|
-
- examples/
|
|
168
|
+
- examples/text_layouter_alignment.rb
|
|
169
|
+
- examples/text_layouter_inline_boxes.rb
|
|
170
|
+
- examples/text_layouter_line_wrapping.rb
|
|
171
|
+
- examples/text_layouter_shapes.rb
|
|
172
|
+
- examples/text_layouter_styling.rb
|
|
172
173
|
- examples/truetype.rb
|
|
173
174
|
- lib/hexapdf.rb
|
|
174
175
|
- lib/hexapdf/cli.rb
|
|
@@ -266,6 +267,7 @@ files:
|
|
|
266
267
|
- lib/hexapdf/font/type1_wrapper.rb
|
|
267
268
|
- lib/hexapdf/font_loader.rb
|
|
268
269
|
- lib/hexapdf/font_loader/from_configuration.rb
|
|
270
|
+
- lib/hexapdf/font_loader/from_file.rb
|
|
269
271
|
- lib/hexapdf/font_loader/standard14.rb
|
|
270
272
|
- lib/hexapdf/image_loader.rb
|
|
271
273
|
- lib/hexapdf/image_loader/jpeg.rb
|
|
@@ -273,12 +275,13 @@ files:
|
|
|
273
275
|
- lib/hexapdf/image_loader/png.rb
|
|
274
276
|
- lib/hexapdf/importer.rb
|
|
275
277
|
- lib/hexapdf/layout.rb
|
|
278
|
+
- lib/hexapdf/layout/box.rb
|
|
276
279
|
- lib/hexapdf/layout/inline_box.rb
|
|
277
|
-
- lib/hexapdf/layout/
|
|
280
|
+
- lib/hexapdf/layout/line.rb
|
|
278
281
|
- lib/hexapdf/layout/numeric_refinements.rb
|
|
279
282
|
- lib/hexapdf/layout/style.rb
|
|
280
|
-
- lib/hexapdf/layout/text_box.rb
|
|
281
283
|
- lib/hexapdf/layout/text_fragment.rb
|
|
284
|
+
- lib/hexapdf/layout/text_layouter.rb
|
|
282
285
|
- lib/hexapdf/layout/text_shaper.rb
|
|
283
286
|
- lib/hexapdf/name_tree_node.rb
|
|
284
287
|
- lib/hexapdf/number_tree_node.rb
|
|
@@ -295,6 +298,17 @@ files:
|
|
|
295
298
|
- lib/hexapdf/task/optimize.rb
|
|
296
299
|
- lib/hexapdf/tokenizer.rb
|
|
297
300
|
- lib/hexapdf/type.rb
|
|
301
|
+
- lib/hexapdf/type/action.rb
|
|
302
|
+
- lib/hexapdf/type/actions.rb
|
|
303
|
+
- lib/hexapdf/type/actions/go_to.rb
|
|
304
|
+
- lib/hexapdf/type/actions/go_to_r.rb
|
|
305
|
+
- lib/hexapdf/type/actions/launch.rb
|
|
306
|
+
- lib/hexapdf/type/actions/uri.rb
|
|
307
|
+
- lib/hexapdf/type/annotation.rb
|
|
308
|
+
- lib/hexapdf/type/annotations.rb
|
|
309
|
+
- lib/hexapdf/type/annotations/link.rb
|
|
310
|
+
- lib/hexapdf/type/annotations/markup_annotation.rb
|
|
311
|
+
- lib/hexapdf/type/annotations/text.rb
|
|
298
312
|
- lib/hexapdf/type/catalog.rb
|
|
299
313
|
- lib/hexapdf/type/cid_font.rb
|
|
300
314
|
- lib/hexapdf/type/embedded_file.rb
|
|
@@ -469,15 +483,17 @@ files:
|
|
|
469
483
|
- test/hexapdf/font/type1/test_font_metrics.rb
|
|
470
484
|
- test/hexapdf/font/type1/test_pfb_parser.rb
|
|
471
485
|
- test/hexapdf/font_loader/test_from_configuration.rb
|
|
486
|
+
- test/hexapdf/font_loader/test_from_file.rb
|
|
472
487
|
- test/hexapdf/font_loader/test_standard14.rb
|
|
473
488
|
- test/hexapdf/image_loader/test_jpeg.rb
|
|
474
489
|
- test/hexapdf/image_loader/test_pdf.rb
|
|
475
490
|
- test/hexapdf/image_loader/test_png.rb
|
|
491
|
+
- test/hexapdf/layout/test_box.rb
|
|
476
492
|
- test/hexapdf/layout/test_inline_box.rb
|
|
477
|
-
- test/hexapdf/layout/
|
|
493
|
+
- test/hexapdf/layout/test_line.rb
|
|
478
494
|
- test/hexapdf/layout/test_style.rb
|
|
479
|
-
- test/hexapdf/layout/test_text_box.rb
|
|
480
495
|
- test/hexapdf/layout/test_text_fragment.rb
|
|
496
|
+
- test/hexapdf/layout/test_text_layouter.rb
|
|
481
497
|
- test/hexapdf/layout/test_text_shaper.rb
|
|
482
498
|
- test/hexapdf/task/test_dereference.rb
|
|
483
499
|
- test/hexapdf/task/test_optimize.rb
|
|
@@ -497,11 +513,17 @@ files:
|
|
|
497
513
|
- test/hexapdf/test_serializer.rb
|
|
498
514
|
- test/hexapdf/test_stream.rb
|
|
499
515
|
- test/hexapdf/test_tokenizer.rb
|
|
516
|
+
- test/hexapdf/test_type.rb
|
|
500
517
|
- test/hexapdf/test_writer.rb
|
|
501
518
|
- test/hexapdf/test_xref_section.rb
|
|
519
|
+
- test/hexapdf/type/actions/test_launch.rb
|
|
520
|
+
- test/hexapdf/type/actions/test_uri.rb
|
|
521
|
+
- test/hexapdf/type/annotations/test_link.rb
|
|
522
|
+
- test/hexapdf/type/annotations/test_markup_annotation.rb
|
|
523
|
+
- test/hexapdf/type/annotations/test_text.rb
|
|
524
|
+
- test/hexapdf/type/test_annotation.rb
|
|
502
525
|
- test/hexapdf/type/test_catalog.rb
|
|
503
526
|
- test/hexapdf/type/test_cid_font.rb
|
|
504
|
-
- test/hexapdf/type/test_embedded_file.rb
|
|
505
527
|
- test/hexapdf/type/test_file_specification.rb
|
|
506
528
|
- test/hexapdf/type/test_font.rb
|
|
507
529
|
- test/hexapdf/type/test_font_descriptor.rb
|
|
@@ -511,7 +533,6 @@ files:
|
|
|
511
533
|
- test/hexapdf/type/test_form.rb
|
|
512
534
|
- test/hexapdf/type/test_image.rb
|
|
513
535
|
- test/hexapdf/type/test_info.rb
|
|
514
|
-
- test/hexapdf/type/test_names.rb
|
|
515
536
|
- test/hexapdf/type/test_object_stream.rb
|
|
516
537
|
- test/hexapdf/type/test_page.rb
|
|
517
538
|
- test/hexapdf/type/test_page_tree_node.rb
|
|
@@ -538,7 +559,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
538
559
|
requirements:
|
|
539
560
|
- - ">="
|
|
540
561
|
- !ruby/object:Gem::Version
|
|
541
|
-
version: '2.
|
|
562
|
+
version: '2.4'
|
|
542
563
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
543
564
|
requirements:
|
|
544
565
|
- - ">="
|
|
@@ -546,7 +567,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
546
567
|
version: '0'
|
|
547
568
|
requirements: []
|
|
548
569
|
rubyforge_project:
|
|
549
|
-
rubygems_version: 2.6.
|
|
570
|
+
rubygems_version: 2.6.14
|
|
550
571
|
signing_key:
|
|
551
572
|
specification_version: 4
|
|
552
573
|
summary: HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
# ## Text Box with Inline Boxes
|
|
2
|
-
#
|
|
3
|
-
# The [HexaPDF::Layout::TextBox] class can be used to easily lay out text mixed
|
|
4
|
-
# with inline boxes.
|
|
5
|
-
#
|
|
6
|
-
# Inline boxes are used for showing graphics that follow the flow of the text.
|
|
7
|
-
# This means that their horizontal and their general vertical position is
|
|
8
|
-
# determined by the text layout functionality. However, inline boxes may be
|
|
9
|
-
# vertically aligned to various positions, like the baseline, the top/bottom of
|
|
10
|
-
# the text and the top/bottom of the line.
|
|
11
|
-
#
|
|
12
|
-
# This example shows some text containing emoticons that are replaced with their
|
|
13
|
-
# graphical representation, with normal smileys being aligned to the baseline
|
|
14
|
-
# and winking smileys to the top of the line.
|
|
15
|
-
#
|
|
16
|
-
# Usage:
|
|
17
|
-
# : `ruby text_box_inline_boxes.rb`
|
|
18
|
-
#
|
|
19
|
-
|
|
20
|
-
require 'hexapdf'
|
|
21
|
-
|
|
22
|
-
include HexaPDF::Layout
|
|
23
|
-
|
|
24
|
-
sample_text = "Lorem ipsum :-) dolor sit amet, consectetur adipiscing
|
|
25
|
-
;-) elit, sed do eiusmod tempor incididunt :-) ut labore et dolore magna
|
|
26
|
-
aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco
|
|
27
|
-
laboris nisi ut aliquip ex ea commodo consequat ;-). Duis aute irure
|
|
28
|
-
dolor in reprehenderit in voluptate velit esse cillum :-) dolore eu
|
|
29
|
-
fugiat nulla pariatur. ".tr("\n", ' ') * 4
|
|
30
|
-
|
|
31
|
-
doc = HexaPDF::Document.new
|
|
32
|
-
emoji_smile = doc.images.add(File.join(__dir__, "emoji-smile.png"))
|
|
33
|
-
emoji_wink = doc.images.add(File.join(__dir__, "emoji-wink.png"))
|
|
34
|
-
size = 10
|
|
35
|
-
|
|
36
|
-
items = sample_text.split(/(:-\)|;-\))/).map do |part|
|
|
37
|
-
case part
|
|
38
|
-
when ':-)'
|
|
39
|
-
InlineBox.new(size * 2, size * 2, valign: :baseline) do |box, canvas|
|
|
40
|
-
canvas.image(emoji_smile, at: [0, 0], width: box.width)
|
|
41
|
-
end
|
|
42
|
-
when ';-)'
|
|
43
|
-
InlineBox.new(size, size, valign: :top) do |box, canvas|
|
|
44
|
-
canvas.image(emoji_wink, at: [0, 0], width: box.width)
|
|
45
|
-
end
|
|
46
|
-
else
|
|
47
|
-
TextFragment.create(part, font: doc.fonts.load("Times"), font_size: 18)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
box = TextBox.new(items: items, width: 500, height: 700)
|
|
52
|
-
box.style.align = :justify
|
|
53
|
-
box.style.line_spacing(:proportional, 1.5)
|
|
54
|
-
box.draw(doc.pages.add.canvas, 50, 800)
|
|
55
|
-
|
|
56
|
-
doc.write("text_box_inline_boxes.pdf")
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# ## Text Box Styling
|
|
2
|
-
#
|
|
3
|
-
# The text used as part of a [HexaPDF::Layout::TextBox] class can be styled
|
|
4
|
-
# using [HexaPDF::Layout::Style]. To do this [HexaPDF::Layout::TextFragment]
|
|
5
|
-
# objects have to be created with the needed styling and then added to a text
|
|
6
|
-
# box. In addition the style objects can be used for styling text boxes
|
|
7
|
-
# themselves.
|
|
8
|
-
#
|
|
9
|
-
# This example shows how to do this and shows off the various styling option.
|
|
10
|
-
#
|
|
11
|
-
# Usage:
|
|
12
|
-
# : `ruby text_box_styling.rb`
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
require 'hexapdf'
|
|
16
|
-
|
|
17
|
-
# Wraps the text in a TextFragment using the given style.
|
|
18
|
-
def fragment(text, style)
|
|
19
|
-
HexaPDF::Layout::TextFragment.new(items: style.font.decode_utf8(text),
|
|
20
|
-
style: style)
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
# Draws the text box at the given [x, y] position onto the canvas.
|
|
24
|
-
def draw_box(box, canvas, x, y)
|
|
25
|
-
rest, height = box.fit
|
|
26
|
-
raise "Error" unless rest.empty?
|
|
27
|
-
box.draw(canvas, x, y)
|
|
28
|
-
y - height
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
sample_text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit,
|
|
32
|
-
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut
|
|
33
|
-
enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut
|
|
34
|
-
aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit
|
|
35
|
-
in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
|
|
36
|
-
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui
|
|
37
|
-
officia deserunt mollit anim id est laborum. ".tr("\n", ' ') * 3
|
|
38
|
-
|
|
39
|
-
doc = HexaPDF::Document.new
|
|
40
|
-
|
|
41
|
-
heading = HexaPDF::Layout::Style.new(font: doc.fonts.load("Helvetica", variant: :bold),
|
|
42
|
-
font_size: 16, align: :center)
|
|
43
|
-
body = HexaPDF::Layout::Style.new(font: doc.fonts.load("Times"),
|
|
44
|
-
font_size: 10, align: :justify,
|
|
45
|
-
text_indent: 20)
|
|
46
|
-
body.line_spacing(:proportional, 1.5)
|
|
47
|
-
standout = HexaPDF::Layout::Style.new(font: doc.fonts.load("Times", variant: :bold),
|
|
48
|
-
font_size: 14)
|
|
49
|
-
|
|
50
|
-
canvas = doc.pages.add.canvas
|
|
51
|
-
y_base = 800
|
|
52
|
-
left = 50
|
|
53
|
-
width = 500
|
|
54
|
-
|
|
55
|
-
box = HexaPDF::Layout::TextBox.new(items: [fragment("This is a header", heading)],
|
|
56
|
-
width: width, style: heading)
|
|
57
|
-
y_base = draw_box(box, canvas, left, y_base)
|
|
58
|
-
|
|
59
|
-
box = HexaPDF::Layout::TextBox.new(items: [fragment(sample_text, body)],
|
|
60
|
-
width: width, style: body)
|
|
61
|
-
y_base = draw_box(box, canvas, left, y_base - 20)
|
|
62
|
-
|
|
63
|
-
items = [
|
|
64
|
-
fragment(sample_text[0, 50], body), fragment(sample_text[50, 15], standout),
|
|
65
|
-
fragment(sample_text[65, 150], body), fragment(sample_text[215, 50], standout),
|
|
66
|
-
fragment(sample_text[265...800], body), fragment(sample_text[800, 40], standout),
|
|
67
|
-
fragment(sample_text[840..-1], body)
|
|
68
|
-
]
|
|
69
|
-
box = HexaPDF::Layout::TextBox.new(items: items, width: width, style: body)
|
|
70
|
-
draw_box(box, canvas, left, y_base - 20)
|
|
71
|
-
|
|
72
|
-
doc.write("text_box_styling.pdf", optimize: true)
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'test_helper'
|
|
2
|
-
require 'hexapdf/type/embedded_file'
|
|
3
|
-
|
|
4
|
-
describe HexaPDF::Type::EmbeddedFile::MacInfo do
|
|
5
|
-
it "uses a custom type" do
|
|
6
|
-
obj = HexaPDF::Type::EmbeddedFile::MacInfo.new({})
|
|
7
|
-
assert_equal(:XXEmbeddedFileParametersMacInfo, obj.type)
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe HexaPDF::Type::EmbeddedFile::Parameters do
|
|
12
|
-
it "uses a custom type" do
|
|
13
|
-
obj = HexaPDF::Type::EmbeddedFile::Parameters.new({})
|
|
14
|
-
assert_equal(:XXEmbeddedFileParameters, obj.type)
|
|
15
|
-
end
|
|
16
|
-
end
|