prawn-qrcode 0.3.0 → 0.5.2
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 +5 -5
- data/README.md +5 -32
- data/Rakefile +14 -7
- data/examples/autosize_qrcode.rb +6 -6
- data/examples/dotsize_qrcode.rb +6 -6
- data/examples/prepared_qrcode.rb +8 -8
- data/examples/table_qrcode.rb +35 -0
- data/lib/prawn/qrcode.rb +184 -80
- data/lib/prawn/qrcode/table.rb +28 -0
- data/lib/prawn/qrcode/table/cell.rb +45 -0
- data/lib/prawn/qrcode/version.rb +17 -1
- data/prawn-qrcode.gemspec +22 -21
- data/test/test_minqrcode.rb +11 -0
- data/test/test_qrcode_in_context.rb +18 -0
- data/test/test_renderer.rb +28 -0
- metadata +65 -15
- data/examples/autosize.pdf +0 -5647
- data/examples/dotsize.pdf +0 -0
- data/examples/prepared.pdf +0 -4273
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 3587fc7dbd82b33c463d766acd6d5d66615c6fc4b8366c9bd454dd0e2bc19de3
|
4
|
+
data.tar.gz: b2ef597a09d3f33060ed1cc329f8feebf52f22d35882760acf2f9cada65cc47b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e64c1e7436259d33b6dd0949693946fbc785b114169c0cb8412f180ae99fc2bb742f58db46ee7b202e4ef534c074b192d858609c0da048dbaba6a8ba5d65b637
|
7
|
+
data.tar.gz: 0147b627f63876d455cf7e683c8efee880ab018a1c28db9740df7ace419aabc56502030d58992d1fd23d72e2b44d75bb0a18997d51b038f1664a5dc2e4a95ff5
|
data/README.md
CHANGED
@@ -5,7 +5,7 @@ A simple extension to generate and/or render QRCodes for Prawn PDFs
|
|
5
5
|

|
6
6
|
[](http://badge.fury.io/rb/prawn-qrcode)
|
7
7
|
|
8
|
-
Prawn/QRCode is a Prawn (>= 0.
|
8
|
+
Prawn/QRCode is a Prawn (>= 1.0.0) extension to simplify rendering of QR Codes*.
|
9
9
|
|
10
10
|
(*) QR Code is registered trademark of DENSO WAVE INCORPORATED.
|
11
11
|
See http://www.denso-wave.com/qrcode/ for more information.
|
@@ -13,7 +13,7 @@ Prawn/QRCode is a Prawn (>= 0.11.1) extension to simplify rendering of QR Codes*
|
|
13
13
|
## Install
|
14
14
|
|
15
15
|
```bash
|
16
|
-
|
16
|
+
gem install prawn-qrcode
|
17
17
|
```
|
18
18
|
|
19
19
|
## Usage
|
@@ -22,7 +22,7 @@ $ gem install prawn-qrcode
|
|
22
22
|
require 'prawn/qrcode'
|
23
23
|
|
24
24
|
qrcode_content = "http://github.com/jabbrwcky/prawn-qrcode"
|
25
|
-
qrcode = RQRCode::QRCode.new(qrcode_content, :
|
25
|
+
qrcode = RQRCode::QRCode.new(qrcode_content, level: :h, size: 5)
|
26
26
|
|
27
27
|
# Render a prepared QRCode at he cursor position
|
28
28
|
# using a default module (e.g. dot) size of 1pt or 1/72 in
|
@@ -34,43 +34,16 @@ end
|
|
34
34
|
# Render a code for raw content and a given total code size.
|
35
35
|
# Renders a QR Code at the cursor position measuring 1 in in width/height.
|
36
36
|
Prawn::Document::new do
|
37
|
-
print_qr_code(qrcode_content, :
|
37
|
+
print_qr_code(qrcode_content, extent: 72)
|
38
38
|
render_file("qr2.pdf")
|
39
39
|
end
|
40
40
|
|
41
41
|
# Render a code for raw content with a given dot size
|
42
42
|
Prawn::Document::new do
|
43
43
|
# Renders a QR Code at he cursor position using a dot (module) size of 2.8/72 in (roughly 1 mm).
|
44
|
-
render_qr_code(
|
44
|
+
render_qr_code(qrcode, dot: 2.8)
|
45
45
|
render_file("qr3.pdf")
|
46
46
|
end
|
47
47
|
```
|
48
48
|
|
49
49
|
For a full list of examples, take a look in the `examples` folder.
|
50
|
-
|
51
|
-
## Changelog
|
52
|
-
|
53
|
-
### 0.1.0
|
54
|
-
Initial Release
|
55
|
-
|
56
|
-
### 0.1.1
|
57
|
-
Updated prawn dependency from exact requirement of 0.11.1 to an >=0.11.1, <0.13
|
58
|
-
|
59
|
-
### 0.1.2
|
60
|
-
Integrated patch to reduce rectangle count, which leads to a overall size reduction
|
61
|
-
of the generated PDF (bdurette)
|
62
|
-
|
63
|
-
### 0.2.0
|
64
|
-
Integrated patch from bdurette to align QR Code within its bounding box.
|
65
|
-
Adds the optional parameter :align (:left, :center, :right) to both
|
66
|
-
render_qr_code() and print_qr_code()
|
67
|
-
|
68
|
-
### 0.2.1
|
69
|
-
Updated prawn dependnecy spec to >= 0.11.1.
|
70
|
-
|
71
|
-
### 0.2.2
|
72
|
-
Fixed default stroke and explicit conversion of extents to floats.
|
73
|
-
|
74
|
-
### 0.2.2.1
|
75
|
-
Stroke param broken. Replaced with simpler evaluation.
|
76
|
-
|
data/Rakefile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011 Jens Hausherr
|
1
|
+
# Copyright 2011 - 2109 Jens Hausherr
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -13,16 +13,23 @@
|
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
15
|
require 'rake'
|
16
|
-
require
|
17
|
-
require
|
18
|
-
require
|
16
|
+
require 'rubygems'
|
17
|
+
require 'rubygems/package_task'
|
18
|
+
require 'bundler/gem_tasks'
|
19
|
+
require 'rake/testtask'
|
19
20
|
|
20
|
-
spec = Gem::Specification.load
|
21
|
+
spec = Gem::Specification.load 'prawn-qrcode.gemspec'
|
21
22
|
Gem::PackageTask.new(spec).define do |pkg|
|
22
|
-
#pkg.need_zip = true
|
23
|
+
# pkg.need_zip = true
|
23
24
|
pkg.need_tar = true
|
24
25
|
end
|
25
26
|
|
26
|
-
|
27
|
+
Rake::TestTask.new(:test) do |t|
|
28
|
+
t.libs << 'test'
|
29
|
+
t.libs << 'lib'
|
30
|
+
t.test_files = FileList['test/test_*.rb']
|
31
|
+
end
|
32
|
+
|
33
|
+
task :default => :test
|
27
34
|
|
28
35
|
task :clean => :clobber_package
|
data/examples/autosize_qrcode.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011 Jens Hausherr
|
1
|
+
# Copyright 2011 - 2109 Jens Hausherr
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -16,21 +16,21 @@ require 'prawn'
|
|
16
16
|
require 'prawn/measurement_extensions'
|
17
17
|
require_relative '../lib/prawn/qrcode'
|
18
18
|
|
19
|
-
|
19
|
+
data = 'https://github.com/jabbrwcky/prawn-qrcode'
|
20
20
|
|
21
21
|
Prawn::Document.new(page_size: 'A4') do
|
22
22
|
text 'Sample autosized QR-Code (with stroked bounds) Size of QRCode : 1 in (72 pt)'
|
23
|
-
print_qr_code(
|
23
|
+
print_qr_code(data, extent: 72)
|
24
24
|
move_down 20
|
25
25
|
|
26
26
|
text 'Sample autosized QR-Code (with and without stroked bounds) Size of QRCode : 2 in (144 pt)'
|
27
27
|
cpos = cursor
|
28
|
-
print_qr_code(
|
29
|
-
print_qr_code(
|
28
|
+
print_qr_code(data, extent: 144)
|
29
|
+
print_qr_code(data, pos: [150, cpos], extent: 144, stroke: false)
|
30
30
|
move_down 10
|
31
31
|
|
32
32
|
text 'Sample autosized QR-Code (with stroked bounds) Size of QRCode :10 cm'
|
33
|
-
print_qr_code(
|
33
|
+
print_qr_code(data, extent: 10.send(:cm), stroke: true, level: :q)
|
34
34
|
move_down 10
|
35
35
|
text "Quite huge, isn't it?"
|
36
36
|
render_file('autosize.pdf')
|
data/examples/dotsize_qrcode.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011 Jens Hausherr
|
1
|
+
# Copyright 2011 - 2109 Jens Hausherr
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -39,9 +39,9 @@ Prawn::Document.new(page_size: 'A4') do
|
|
39
39
|
print_qr_code(qrcode, dot: 1.mm)
|
40
40
|
print_qr_code(qrcode, pos: [150, cpos], dot: 1.mm, stroke: false)
|
41
41
|
font 'Courier', size: 8 do
|
42
|
-
text_box "require 'prawn/measurement_extensions'\n\n"
|
43
|
-
|
44
|
-
|
42
|
+
text_box "require 'prawn/measurement_extensions'\n\n" \
|
43
|
+
"print_qr_code(qrcode, dot: 1.mm)\n" \
|
44
|
+
'print_qr_code(qrcode, pos: [150,cpos], dot: 1.mm, stroke: false)', at: [320, cpos], height: 200, width: 220
|
45
45
|
end
|
46
46
|
|
47
47
|
move_down 30
|
@@ -53,8 +53,8 @@ Prawn::Document.new(page_size: 'A4') do
|
|
53
53
|
cpos = cursor
|
54
54
|
print_qr_code(qrcode, dot: 1.mm, level: :q)
|
55
55
|
font 'Courier', size: 8 do
|
56
|
-
text_box "require 'prawn/measurement_extensions'\n\n"
|
57
|
-
|
56
|
+
text_box "require 'prawn/measurement_extensions'\n\n" \
|
57
|
+
'print_qr_code(qrcode, dot: 1.mm, level: :q)', at: [320, cpos], height: 200, width: 220
|
58
58
|
end
|
59
59
|
render_file('dotsize.pdf')
|
60
60
|
end
|
data/examples/prepared_qrcode.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2011 Jens Hausherr
|
1
|
+
# Copyright 2011 - 2109 Jens Hausherr
|
2
2
|
#
|
3
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
4
|
# you may not use this file except in compliance with the License.
|
@@ -15,17 +15,17 @@ require 'rubygems'
|
|
15
15
|
require 'prawn'
|
16
16
|
require_relative '../lib/prawn/qrcode'
|
17
17
|
|
18
|
-
qrcode = RQRCode::QRCode.new('https://github.com/jabbrwcky/prawn-qrcode', :
|
18
|
+
qrcode = RQRCode::QRCode.new('https://github.com/jabbrwcky/prawn-qrcode', size: 5)
|
19
19
|
|
20
|
-
Prawn::Document
|
21
|
-
text
|
20
|
+
Prawn::Document.new(page_size: 'A4') do
|
21
|
+
text 'Prawn QR Code sample 1: Predefined QR-Code'
|
22
22
|
move_down 10
|
23
|
-
text
|
23
|
+
text 'Sample predefined QR-Code (with stroked bounds) Size of QRCode dots: 1pt (1/72 in)'
|
24
24
|
move_down 45
|
25
25
|
render_qr_code(qrcode)
|
26
26
|
move_down 10
|
27
|
-
text
|
27
|
+
text 'Sample predefined QR-Code (without stroked bounds) Size of QRCode dots: 1pt (1/72 in)'
|
28
28
|
move_down 45
|
29
|
-
render_qr_code(qrcode, :
|
30
|
-
render_file(
|
29
|
+
render_qr_code(qrcode, stroke: false)
|
30
|
+
render_file('prepared.pdf')
|
31
31
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright 2011 - 2019 Jens Hausherr
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
require 'rubygems'
|
15
|
+
require 'prawn'
|
16
|
+
require 'prawn/measurement_extensions'
|
17
|
+
require 'prawn/table'
|
18
|
+
require_relative '../lib/prawn/qrcode'
|
19
|
+
require_relative '../lib/prawn/qrcode/table'
|
20
|
+
|
21
|
+
# qrcode = 'https://github.com/jabbrwcky/prawn-qrcode'
|
22
|
+
|
23
|
+
Prawn::Document.new(page_size: 'A4') do
|
24
|
+
font 'Helvetica', style: :bold do
|
25
|
+
text 'QRCode in table'
|
26
|
+
end
|
27
|
+
move_down 5.mm
|
28
|
+
cpos = cursor
|
29
|
+
qr = make_qrcode_cell(content: 'https://github.com/jabbrwcky/prawn-qrcode', extent: 72)
|
30
|
+
t = make_table([%w[URL QRCODE],
|
31
|
+
['https://github.com/jabbrwcky/prawn-qrcode', qr]])
|
32
|
+
t.draw
|
33
|
+
move_down 20
|
34
|
+
render_file('table.pdf')
|
35
|
+
end
|
data/lib/prawn/qrcode.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#--
|
2
|
-
# Copyright 2010-
|
2
|
+
# Copyright 2010 - 2019 Jens Hausherr
|
3
3
|
#
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
# you may not use this file except in compliance with the License.
|
@@ -21,107 +21,211 @@ require 'rqrcode'
|
|
21
21
|
# :main: This is an extension for Prawn::Document to simplify rendering QR Codes.
|
22
22
|
# The module registers itself as Prawn extension upon loading.
|
23
23
|
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
24
|
+
# @author Jens Hausherr <jabbrwcky@gmail.com>
|
25
|
+
# @copyright Copyright (c) 2011 -2019 Jens Hausherr
|
26
|
+
# @license Apache License, Version 2.0
|
27
27
|
#
|
28
28
|
module Prawn
|
29
29
|
module QRCode
|
30
|
-
#
|
30
|
+
# DEFAULT_DOTSIZE defines the default size for QR Code modules in multiples of 1/72 in
|
31
31
|
DEFAULT_DOTSIZE = 1.to_f
|
32
32
|
|
33
|
-
#
|
33
|
+
# Creates a QRCode with a minimal size to fit the data with the requested error correction level.
|
34
|
+
# @since 0.5.0
|
34
35
|
#
|
35
|
-
# content
|
36
|
+
# @param [string] content The string to render as content of the QR Code
|
37
|
+
# @param [Integer] qr_version Optional number of modules to use initially. Will use more if input overflows module size (Default: 0)
|
38
|
+
# @param [symbol] level Optional Error correction level to use. One of: (:l, :m, :h, :q), Defaults to :m
|
39
|
+
# @param [symbol] mode Optional mode. One of (:number, :alphanumeric, :byte_8bit, :kanji), Defaults to :alphanumeric or :byte_8bit
|
36
40
|
#
|
37
|
-
#
|
41
|
+
# @return [RQRCode::QRCode] QR code that can hold the specified data with the desired error correction level
|
38
42
|
#
|
39
|
-
#
|
40
|
-
# +:extent+:: Size of QR Code given in pt (1 pt == 1/72 in)
|
41
|
-
# +:pos+:: Two-element array containing the position at which the QR-Code should be rendered. Defaults to [0,cursor]
|
42
|
-
# +:dot+:: Size of QR Code module/dot. Calculated from extent or defaulting to 1pt
|
43
|
-
# +:stroke+:: boolean value whether to draw bounds around the QR Code.
|
44
|
-
# Defaults to true.
|
45
|
-
# +:align+:: Optional alignment within the current bounding box. Valid values are :left, :right, and :center. If set
|
46
|
-
# This option overrides the horizontal positioning specified in :pos. Defaults to nil.
|
47
|
-
# +:debug+:: Optional boolean, renders a coordinate grid around the QRCode if true (uses Prawn#stroke_axis)
|
43
|
+
# @raise [RQRCodeCore::QRCodeRunTimeError] if the data specified will not fit in the largest QR code (QR version 40) with the given error correction level
|
48
44
|
#
|
49
|
-
def
|
50
|
-
qr_version
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
45
|
+
def self.min_qrcode(content, qr_version = 0, level: :m, mode: nil, **)
|
46
|
+
qr_version += 1
|
47
|
+
RQRCode::QRCode.new(content, size: qr_version, level: level, mode: mode)
|
48
|
+
rescue RQRCodeCore::QRCodeRunTimeError
|
49
|
+
retry if qr_version < 40
|
50
|
+
raise
|
51
|
+
end
|
52
|
+
|
53
|
+
# dotsize calculates the required dotsize for a QR code to be rendered with the given extent and the module size
|
54
|
+
# @since 0.5.0
|
55
|
+
#
|
56
|
+
# @param [RQRCode::QRCode] qr_code QR code to render
|
57
|
+
# @param [Integer/Float] extent Size of QR code given in pt (1 pt == 1/72 in)
|
58
|
+
# @param [Integer] margin Width of margin as number of modules (defaults to 4 modules)
|
59
|
+
#
|
60
|
+
# @return [Float] size of dot in pt (1/72 in)
|
61
|
+
def self.dotsize(qr_code, extent, margin = 4)
|
62
|
+
extent.to_f / (2 * margin + qr_code.modules.length).to_f
|
63
|
+
end
|
64
|
+
|
65
|
+
# Prints a QR Code to the PDF document. The QR Code creation happens on the fly.
|
66
|
+
#
|
67
|
+
# @param [string] content The string to render as content of the QR Code
|
68
|
+
# @param [symbol] level Error correction level to use. One of: (:l, :m, :h, :q), Defaults to :m
|
69
|
+
# @param [symbol] mode Optional mode. One of (:number, :alphanumeric, :byte_8bit, :kanji), Defaults to :alphanumeric or :byte_8bit
|
70
|
+
# @param [Array] pos Two-element array containing the position at which the QR-Code should be rendered. Defaults to [0,cursor]
|
71
|
+
# @param [Hash] options additional options that are passed on to Prawn::QRCode::Renderer
|
72
|
+
#
|
73
|
+
# @see Renderer
|
74
|
+
#
|
75
|
+
def print_qr_code(content, level: :m, mode: nil, pos: [0, cursor], **options)
|
76
|
+
qr_code = Prawn::QRCode.min_qrcode(content, level: level, mode: mode)
|
77
|
+
render_qr_code(qr_code, pos: pos, **options)
|
66
78
|
end
|
67
79
|
|
68
|
-
# Renders a prepared QR
|
80
|
+
# Renders a prepared QR code (RQRCode::QRCode) int the pdf.
|
81
|
+
# @since 0.5.0
|
69
82
|
#
|
70
|
-
#
|
83
|
+
# @param [RQRCode::QRCode] qr_code The QR code (an RQRCode::QRCode) to render
|
84
|
+
# @param [Hash] options additional options that are passed on to Prawn::QRCode::Renderer
|
71
85
|
#
|
72
|
-
#
|
73
|
-
# +:extent+:: Size of QR Code given in pt (1 pt == 1/72 in)
|
74
|
-
# +:pos+:: Two-element array containing the position at which the QR-Code should be rendered. Defaults to [0,cursor]
|
75
|
-
# +:dot+:: Size of QR Code module/dot. Calculated from extent or defaulting to 1pt
|
76
|
-
# +:stroke+:: boolean value whether to draw bounds around the QR Code. Defaults to true.
|
77
|
-
# +:align+:: Optional alignment within the current bounding box. Valid values are :left, :right, and :center. If set
|
78
|
-
# This option overrides the horizontal positioning specified in :pos. Defaults to nil.
|
79
|
-
# +:debug+:: Optional boolean, renders a coordinate grid around the QRCode if true (uses Prawn#stroke_axis)
|
86
|
+
# @see Renderer
|
80
87
|
#
|
81
|
-
def render_qr_code(qr_code,
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
88
|
+
def render_qr_code(qr_code, **options)
|
89
|
+
renderer = Renderer.new(qr_code, **options)
|
90
|
+
renderer.render(self)
|
91
|
+
end
|
92
|
+
|
93
|
+
# QRCodeError is raised on errors specific to Prawn::QRCode
|
94
|
+
# @since 0.5.0
|
95
|
+
class QRCodeError < StandardError; end
|
96
|
+
|
97
|
+
# Renderer is responsible for actually rendering a QR code to pdf
|
98
|
+
# @since 0.5.0
|
99
|
+
class Renderer
|
100
|
+
attr_accessor :qr_code
|
101
|
+
|
102
|
+
RENDER_OPTS = %I[dot pos stroke foreground_color background_color stroke_color margin align debug extent].freeze
|
103
|
+
RENDER_OPTS.each { |attr| attr_writer attr }
|
104
|
+
|
105
|
+
# creates a new renderer for the given QR code
|
106
|
+
#
|
107
|
+
# @param qr_code [RQRCode::QRCode] QR code to render
|
108
|
+
# @param [Hash] options additional options
|
109
|
+
# @option options [Float] :dot size of a dot in pt (1/72 in)
|
110
|
+
# @option options [Array] :pos Two-element array containing the position at which the QR-Code should be rendered. Defaults to [0,cursor]
|
111
|
+
# @option options [bool] :stroke whether to draw bounds around the QR Code. Defaults to true.
|
112
|
+
# @option options [string] :foreground_color 6-digit hex string specifying foreground color; default: '000000'
|
113
|
+
# @option options [string] :background_color 6-digit hex string specifying background color; default: 'FFFFFF'
|
114
|
+
# @option options [string] :stroke_color 6-digit hex string specifying stroke color; default: '000000'
|
115
|
+
# @option options [integer] :margin number of modules as margin around QRcode (default: 4)
|
116
|
+
# @option options [float] :extent overall width/height of QR code in pt (1/72 in)
|
117
|
+
# @option options [bool] :debug render a coordinate grid around the QRCode if true (uses Prawn#stroke_axis)
|
118
|
+
# @option options [symbol] :align alignment within the current bounding box. Valid values are :left, :right, and :center. If set
|
119
|
+
# this option overrides the horizontal positioning specified in :pos. Defaults to nil.
|
120
|
+
#
|
121
|
+
# Options :dot and :extent are mutually exclusive.
|
122
|
+
#
|
123
|
+
# @raise [QRCodeError] if both extent and dot are specified.
|
124
|
+
def initialize(qr_code, **options)
|
125
|
+
raise QRCodeError, 'Specify either :dot or :extent, not both' if options.key?(:dot) && options.key?(:extent)
|
126
|
+
|
127
|
+
@stroke = true
|
128
|
+
@qr_code = qr_code
|
129
|
+
options.select { |k, _v| RENDER_OPTS.include?(k) }.each { |k, v| send("#{k}=", v) }
|
91
130
|
end
|
92
131
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
132
|
+
def dot
|
133
|
+
@dot ||= Prawn::QRCode.dotsize(qr_code, @extent, margin) if defined?(@extent)
|
134
|
+
@dot ||= DEFAULT_DOTSIZE unless defined?(@extent)
|
135
|
+
@dot
|
136
|
+
end
|
137
|
+
|
138
|
+
attr_reader :stroke
|
139
|
+
|
140
|
+
def foreground_color
|
141
|
+
@foreground_color ||= '000000'
|
142
|
+
end
|
143
|
+
|
144
|
+
def background_color
|
145
|
+
@background_color ||= 'FFFFFF'
|
146
|
+
end
|
147
|
+
|
148
|
+
def stroke_color
|
149
|
+
@stroke_color ||= '000000'
|
150
|
+
end
|
151
|
+
|
152
|
+
def margin
|
153
|
+
@margin ||= 4
|
154
|
+
end
|
155
|
+
|
156
|
+
def extent
|
157
|
+
@extent ||= (2 * margin + qr_code.modules.length) * dot
|
158
|
+
@extent
|
159
|
+
end
|
160
|
+
|
161
|
+
def margin_size
|
162
|
+
margin * dot
|
163
|
+
end
|
164
|
+
|
165
|
+
def align(bounding_box)
|
166
|
+
rlim = bounding_box.right
|
167
|
+
case @align
|
168
|
+
when :center
|
169
|
+
@pos[0] = (rlim / 2) - (extent / 2)
|
170
|
+
when :right
|
171
|
+
@pos[0] = rlim - extent
|
172
|
+
when :left
|
173
|
+
@pos[0] = 0
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# rubocop:disable Metrics/AbcSize
|
178
|
+
def render(pdf)
|
179
|
+
pdf.fill_color background_color
|
180
|
+
|
181
|
+
pos(pdf) # make sure the @pos attribute is set before calling align
|
182
|
+
align(pdf.bounds)
|
183
|
+
|
184
|
+
pdf.bounding_box(pos(pdf), width: extent, height: extent) do |_box|
|
185
|
+
pdf.fill_color foreground_color
|
186
|
+
margin_dist = margin * dot
|
187
|
+
|
188
|
+
m = qr_code.modules
|
189
|
+
|
190
|
+
pos_y = margin_dist + m.length * dot
|
191
|
+
|
192
|
+
m.each_with_index do |row, index|
|
193
|
+
pos_x = margin_dist
|
194
|
+
dark_col = 0
|
195
|
+
|
196
|
+
row.each_index do |col|
|
197
|
+
pdf.move_to [pos_x, pos_y]
|
198
|
+
if qr_code.qrcode.checked?(index, col)
|
199
|
+
dark_col += 1
|
200
|
+
else
|
201
|
+
if dark_col > 0
|
202
|
+
dark_col_extent = dark_col * dot
|
203
|
+
pdf.fill { pdf.rectangle([pos_x - dark_col_extent, pos_y], dark_col_extent, dot) }
|
204
|
+
dark_col = 0
|
205
|
+
end
|
110
206
|
end
|
207
|
+
pos_x += dot
|
111
208
|
end
|
112
|
-
|
209
|
+
|
210
|
+
pdf.fill { pdf.rectangle([pos_x - dark_col * dot, pos_y], dot * dark_col, dot) } if dark_col > 0
|
211
|
+
|
212
|
+
pos_y -= dot
|
113
213
|
end
|
114
|
-
|
115
|
-
|
214
|
+
|
215
|
+
if stroke
|
216
|
+
pdf.fill_color stroke_color
|
217
|
+
pdf.stroke_bounds
|
116
218
|
end
|
117
|
-
|
219
|
+
pdf.stroke_axis(at: [-1, -1], negative_axes_length: 0, color: '0C0C0C', step_length: 50) if debug
|
118
220
|
end
|
221
|
+
end
|
119
222
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
223
|
+
private
|
224
|
+
|
225
|
+
attr_reader :debug
|
226
|
+
|
227
|
+
def pos(pdf)
|
228
|
+
@pos ||= [0, pdf.cursor]
|
125
229
|
end
|
126
230
|
end
|
127
231
|
end
|