pdf417 0.1.1 → 0.2.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.
- data/README.rdoc +8 -2
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/ext/pdf417/Makefile +3 -3
- data/ext/pdf417/pdf417.c +106 -72
- data/ext/pdf417/pdf417.h +16 -16
- data/lib/pdf417.rb +223 -41
- data/lib/pdf417/lib.rb +54 -0
- data/pdf417.gemspec +13 -8
- data/script/console +10 -0
- data/test/pdf417/lib_test.rb +55 -0
- data/test/pdf417_test.rb +138 -13
- data/test/test_helper.rb +23 -0
- metadata +12 -6
data/README.rdoc
CHANGED
@@ -4,7 +4,7 @@ A wrapper for the pdf417lib C Library, from the README:
|
|
4
4
|
|
5
5
|
A library to generate the 2D barcode PDF417
|
6
6
|
|
7
|
-
Project: http://sourceforge.net/
|
7
|
+
Project: http://pdf417lib.sourceforge.net/
|
8
8
|
Creator: Paulo Soares (psoares@consiste.pt)
|
9
9
|
License: LGPL or MPL 1.1
|
10
10
|
|
@@ -23,13 +23,19 @@ There are a few ways to use the library, at its simplest:
|
|
23
23
|
|
24
24
|
PDF417.encode_text("readable barcode data") => [12, 827, 120, 90, 41, 146, 30, 512, 423, 146, 90, 570]
|
25
25
|
|
26
|
-
If you want to get the
|
26
|
+
If you want to get the raw barcode data from the PDF417 library:
|
27
27
|
|
28
28
|
barcode = PDF417.new("readable barcode data")
|
29
29
|
barcode.to_blob # oops, wrong text
|
30
30
|
barcode.text = "ACTUAL barcode data"
|
31
31
|
barcode.to_blob
|
32
32
|
|
33
|
+
If you want to get it as an array of strings (each array element representing a line)
|
34
|
+
barcode.encoding
|
35
|
+
|
36
|
+
If you have chunky_png installed and you'd rather have a PNG
|
37
|
+
barcode.to_png
|
38
|
+
|
33
39
|
See the RDocs for more information.
|
34
40
|
|
35
41
|
== Note on Patches/Pull Requests
|
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/ext/pdf417/Makefile
CHANGED
@@ -4,11 +4,11 @@ SHELL = /bin/sh
|
|
4
4
|
#### Start of system configuration section. ####
|
5
5
|
|
6
6
|
srcdir = .
|
7
|
-
topdir = /opt/
|
7
|
+
topdir = /opt/rubyEE/lib/ruby/1.8/i686-darwin10.3.0
|
8
8
|
hdrdir = $(topdir)
|
9
9
|
VPATH = $(srcdir):$(topdir):$(hdrdir)
|
10
10
|
exec_prefix = $(prefix)
|
11
|
-
prefix = $(DESTDIR)/opt/
|
11
|
+
prefix = $(DESTDIR)/opt/rubyEE
|
12
12
|
sharedstatedir = $(prefix)/com
|
13
13
|
mandir = $(datarootdir)/man
|
14
14
|
psdir = $(docdir)
|
@@ -62,7 +62,7 @@ RUBY_SO_NAME = ruby
|
|
62
62
|
arch = i686-darwin10.3.0
|
63
63
|
sitearch = i686-darwin10.3.0
|
64
64
|
ruby_version = 1.8
|
65
|
-
ruby = /opt/
|
65
|
+
ruby = /opt/rubyEE/bin/ruby
|
66
66
|
RUBY = $(ruby)
|
67
67
|
RM = rm -f
|
68
68
|
MAKEDIRS = mkdir -p
|
data/ext/pdf417/pdf417.c
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
/* NOTE: This relies on the PDF417 Library from http://sourceforge.net/projects/pdf417lib and is included here
|
2
|
-
*
|
2
|
+
* It is a little odd and not too C-like, because it is called 'pdf417' but defines both the PDF417 and the PDF417::Lib
|
3
|
+
* class. Note that the majority of the functions are for the PDF417::Lib class, the PDF417 class is only a placeholder.
|
3
4
|
*/
|
4
5
|
|
5
6
|
#include <ruby.h>
|
@@ -27,21 +28,22 @@
|
|
27
28
|
|
28
29
|
// The initialization method for this module
|
29
30
|
void Init_pdf417() {
|
30
|
-
rb_cPdf417 = rb_define_class("PDF417", rb_cObject);
|
31
|
-
|
32
|
-
rb_define_singleton_method(
|
33
|
-
|
34
|
-
rb_define_method(
|
35
|
-
rb_define_method(
|
36
|
-
rb_define_method(
|
37
|
-
rb_define_method(
|
38
|
-
rb_define_method(
|
39
|
-
rb_define_method(
|
40
|
-
rb_define_method(
|
41
|
-
rb_define_method(
|
42
|
-
rb_define_method(
|
43
|
-
rb_define_method(
|
44
|
-
rb_define_method(
|
31
|
+
rb_cPdf417 = rb_define_class("PDF417", rb_cObject); // Our PDF417 object
|
32
|
+
rb_cPdf417_Lib = rb_define_class_under(rb_cPdf417, "Lib", rb_cObject); // Our PDF417::Lib object, to represent the C file
|
33
|
+
rb_define_singleton_method(rb_cPdf417_Lib, "encode_text", rb_pdf417_lib_encode_text, 1);
|
34
|
+
rb_define_singleton_method(rb_cPdf417_Lib, "new", rb_pdf417_lib_new, 1);
|
35
|
+
rb_define_method(rb_cPdf417_Lib, "initialize", rb_pdf417_lib_init, 1);
|
36
|
+
rb_define_method(rb_cPdf417_Lib, "codewords", rb_pdf417_lib_codewords, 0);
|
37
|
+
rb_define_method(rb_cPdf417_Lib, "to_blob", rb_pdf417_lib_to_blob, 0);
|
38
|
+
rb_define_method(rb_cPdf417_Lib, "bit_columns", rb_pdf417_lib_bitColumns, 0);
|
39
|
+
rb_define_method(rb_cPdf417_Lib, "bit_length", rb_pdf417_lib_lenBits, 0);
|
40
|
+
rb_define_method(rb_cPdf417_Lib, "code_rows", rb_pdf417_lib_codeRows, 0);
|
41
|
+
rb_define_method(rb_cPdf417_Lib, "code_cols", rb_pdf417_lib_codeColumns, 0);
|
42
|
+
rb_define_method(rb_cPdf417_Lib, "codeword_length", rb_pdf417_lib_lenCodewords, 0);
|
43
|
+
rb_define_method(rb_cPdf417_Lib, "error_level", rb_pdf417_lib_errorLevel, 0);
|
44
|
+
rb_define_method(rb_cPdf417_Lib, "aspect_ratio", rb_pdf417_lib_aspectRatio, 0);
|
45
|
+
rb_define_method(rb_cPdf417_Lib, "y_height", rb_pdf417_lib_yHeight, 0);
|
46
|
+
rb_define_method(rb_cPdf417_Lib, "generation_error", rb_pdf417_lib_error, 0);
|
45
47
|
}
|
46
48
|
|
47
49
|
/*
|
@@ -50,7 +52,7 @@ void Init_pdf417() {
|
|
50
52
|
*
|
51
53
|
* Returns an array of integers showing the codewords
|
52
54
|
*/
|
53
|
-
static VALUE
|
55
|
+
static VALUE rb_pdf417_lib_encode_text(VALUE self, VALUE text) {
|
54
56
|
VALUE list;
|
55
57
|
int k;
|
56
58
|
|
@@ -74,12 +76,12 @@ static VALUE rb_pdf417_encode_text(VALUE self, VALUE text) {
|
|
74
76
|
}
|
75
77
|
|
76
78
|
/* :nodoc: */
|
77
|
-
static void
|
79
|
+
static void rb_pdf417_lib_cleanup(void *p) {
|
78
80
|
pdf417free(p);
|
79
81
|
}
|
80
82
|
|
81
83
|
/* :nodoc: */
|
82
|
-
static VALUE
|
84
|
+
static VALUE rb_pdf417_lib_init(VALUE self, VALUE text) {
|
83
85
|
rb_iv_set(self, "@text", text);
|
84
86
|
return self;
|
85
87
|
}
|
@@ -90,10 +92,10 @@ static VALUE rb_pdf417_init(VALUE self, VALUE text) {
|
|
90
92
|
*
|
91
93
|
* Makes a new PDF417 object for the given text string
|
92
94
|
*/
|
93
|
-
static VALUE
|
95
|
+
static VALUE rb_pdf417_lib_new(VALUE class, VALUE text) {
|
94
96
|
VALUE argv[1];
|
95
97
|
pdf417param *ptr;
|
96
|
-
VALUE tdata = Data_Make_Struct(class, pdf417param, 0,
|
98
|
+
VALUE tdata = Data_Make_Struct(class, pdf417param, 0, rb_pdf417_lib_cleanup, ptr);
|
97
99
|
pdf417init(ptr);
|
98
100
|
rb_iv_set(tdata, "@generation_options", INT2NUM(ptr->options));
|
99
101
|
argv[0] = text;
|
@@ -107,23 +109,29 @@ static VALUE rb_pdf417_new(VALUE class, VALUE text) {
|
|
107
109
|
*
|
108
110
|
* Generates an array of codewords from the current text attribute
|
109
111
|
*/
|
110
|
-
static VALUE
|
111
|
-
VALUE list;
|
112
|
+
static VALUE rb_pdf417_lib_codewords(VALUE self) {
|
113
|
+
VALUE list, text;
|
112
114
|
int k;
|
113
|
-
pdf417param
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
115
|
+
pdf417param p;
|
116
|
+
|
117
|
+
|
118
|
+
text = rb_iv_get(self, "@text");
|
119
|
+
pdf417init(&p);
|
120
|
+
p.text = StringValuePtr(text);
|
121
|
+
fetchCodewords(&p);
|
122
|
+
if (p.error) {
|
123
|
+
pdf417free(&p);
|
124
|
+
return Qnil; //could also return list or raise something
|
118
125
|
}
|
119
126
|
|
120
|
-
list = rb_ary_new2(
|
127
|
+
list = rb_ary_new2(p.lenCodewords);
|
128
|
+
|
129
|
+
pdf417free(&p);
|
121
130
|
|
122
|
-
|
123
|
-
|
124
|
-
rb_ary_push(list, INT2NUM(ptr->codewords[k]));
|
131
|
+
for (k = 0; k < p.lenCodewords; ++k) {
|
132
|
+
rb_ary_push(list, INT2NUM(p.codewords[k]));
|
125
133
|
}
|
126
|
-
return list;
|
134
|
+
return list;
|
127
135
|
}
|
128
136
|
|
129
137
|
/*
|
@@ -132,11 +140,63 @@ static VALUE rb_pdf417_codewords(VALUE self) {
|
|
132
140
|
*
|
133
141
|
* Returns a binary string representing the image bits, requires scaling before display
|
134
142
|
*/
|
135
|
-
static VALUE
|
143
|
+
static VALUE rb_pdf417_lib_to_blob(VALUE self) {
|
144
|
+
VALUE generation_options, text, aspect_ratio, raw_codewords, y_height, error_level, code_rows, code_cols;
|
136
145
|
pdf417param *ptr;
|
146
|
+
int options = 0;
|
147
|
+
|
137
148
|
Data_Get_Struct(self, pdf417param, ptr);
|
138
|
-
|
139
|
-
|
149
|
+
generation_options = rb_iv_get(self, "@generation_options");
|
150
|
+
text = rb_iv_get(self, "@text");
|
151
|
+
aspect_ratio = rb_iv_get(self, "@aspect_ratio");
|
152
|
+
raw_codewords = rb_iv_get(self, "@raw_codewords");
|
153
|
+
y_height = rb_iv_get(self, "@y_height");
|
154
|
+
error_level = rb_iv_get(self, "@error_level");
|
155
|
+
code_rows = rb_iv_get(self, "@code_rows");
|
156
|
+
code_cols = rb_iv_get(self, "@code_cols");
|
157
|
+
|
158
|
+
// re-set our internal variables
|
159
|
+
pdf417init(ptr);
|
160
|
+
|
161
|
+
// Always set the text, can't really go wrong here
|
162
|
+
ptr->text = StringValuePtr(text);
|
163
|
+
|
164
|
+
// Start setting them based off of what we got
|
165
|
+
if ( TYPE(generation_options) == T_FIXNUM ){
|
166
|
+
ptr->options = FIX2INT(generation_options);
|
167
|
+
}
|
168
|
+
|
169
|
+
if ( TYPE(aspect_ratio) == T_FLOAT ){
|
170
|
+
ptr->aspectRatio = (float)NUM2DBL(aspect_ratio);
|
171
|
+
}
|
172
|
+
|
173
|
+
if ( TYPE(y_height) == T_FLOAT ){
|
174
|
+
ptr->yHeight = (float)NUM2DBL(y_height);
|
175
|
+
}
|
176
|
+
|
177
|
+
if ( TYPE(error_level) == T_FIXNUM ){
|
178
|
+
ptr->errorLevel = FIX2INT(error_level);
|
179
|
+
}
|
180
|
+
|
181
|
+
if ( TYPE(code_rows) == T_FIXNUM ){
|
182
|
+
ptr->codeRows = FIX2INT(code_rows);
|
183
|
+
}
|
184
|
+
|
185
|
+
if ( TYPE(code_cols) == T_FIXNUM ){
|
186
|
+
ptr->codeColumns = FIX2INT(code_cols);
|
187
|
+
}
|
188
|
+
|
189
|
+
if ( TYPE(raw_codewords) == T_ARRAY && ptr->options & PDF417_USE_RAW_CODEWORDS){
|
190
|
+
ptr->lenCodewords = RARRAY_LEN(raw_codewords);
|
191
|
+
int k;
|
192
|
+
for (k = 0; k < ptr->lenCodewords; ++k) {
|
193
|
+
ptr->codewords[k] = FIX2INT(rb_ary_entry(raw_codewords, k));
|
194
|
+
}
|
195
|
+
}
|
196
|
+
|
197
|
+
paintCode(ptr);
|
198
|
+
|
199
|
+
if (ptr->error && ptr->error != PDF417_ERROR_SUCCESS) {
|
140
200
|
return Qnil; //could also return list
|
141
201
|
}
|
142
202
|
|
@@ -149,7 +209,7 @@ static VALUE rb_pdf417_to_blob(VALUE self) {
|
|
149
209
|
*
|
150
210
|
* The number of column bits in the bitmap
|
151
211
|
*/
|
152
|
-
static VALUE
|
212
|
+
static VALUE rb_pdf417_lib_bitColumns(VALUE self) {
|
153
213
|
pdf417param *ptr;
|
154
214
|
Data_Get_Struct(self, pdf417param, ptr);
|
155
215
|
return INT2NUM(ptr->bitColumns);
|
@@ -161,7 +221,7 @@ static VALUE rb_pdf417_bitColumns(VALUE self) {
|
|
161
221
|
*
|
162
222
|
* The size in bytes of the bitmap
|
163
223
|
*/
|
164
|
-
static VALUE
|
224
|
+
static VALUE rb_pdf417_lib_lenBits(VALUE self) {
|
165
225
|
pdf417param *ptr;
|
166
226
|
Data_Get_Struct(self, pdf417param, ptr);
|
167
227
|
return INT2NUM(ptr->lenBits);
|
@@ -173,7 +233,7 @@ static VALUE rb_pdf417_lenBits(VALUE self) {
|
|
173
233
|
*
|
174
234
|
* The number of code rows and bitmap lines
|
175
235
|
*/
|
176
|
-
static VALUE
|
236
|
+
static VALUE rb_pdf417_lib_codeRows(VALUE self) {
|
177
237
|
pdf417param *ptr;
|
178
238
|
Data_Get_Struct(self, pdf417param, ptr);
|
179
239
|
return INT2NUM(ptr->codeRows);
|
@@ -181,11 +241,11 @@ static VALUE rb_pdf417_codeRows(VALUE self) {
|
|
181
241
|
|
182
242
|
/*
|
183
243
|
* call-seq:
|
184
|
-
*
|
244
|
+
* code_cols
|
185
245
|
*
|
186
246
|
* The number of code columns
|
187
247
|
*/
|
188
|
-
static VALUE
|
248
|
+
static VALUE rb_pdf417_lib_codeColumns(VALUE self) {
|
189
249
|
pdf417param *ptr;
|
190
250
|
Data_Get_Struct(self, pdf417param, ptr);
|
191
251
|
return INT2NUM(ptr->codeColumns);
|
@@ -197,7 +257,7 @@ static VALUE rb_pdf417_codeColumns(VALUE self) {
|
|
197
257
|
*
|
198
258
|
* The size of the code words, including error correction codes
|
199
259
|
*/
|
200
|
-
static VALUE
|
260
|
+
static VALUE rb_pdf417_lib_lenCodewords(VALUE self) {
|
201
261
|
pdf417param *ptr;
|
202
262
|
Data_Get_Struct(self, pdf417param, ptr);
|
203
263
|
return INT2NUM(ptr->lenCodewords);
|
@@ -209,7 +269,7 @@ static VALUE rb_pdf417_lenCodewords(VALUE self) {
|
|
209
269
|
*
|
210
270
|
* The error level required 0-8
|
211
271
|
*/
|
212
|
-
static VALUE
|
272
|
+
static VALUE rb_pdf417_lib_errorLevel(VALUE self){
|
213
273
|
pdf417param *ptr;
|
214
274
|
Data_Get_Struct(self, pdf417param, ptr);
|
215
275
|
return INT2NUM(ptr->errorLevel);
|
@@ -221,7 +281,7 @@ static VALUE rb_pdf417_errorLevel(VALUE self){
|
|
221
281
|
*
|
222
282
|
* The y/x aspect ratio
|
223
283
|
*/
|
224
|
-
static VALUE
|
284
|
+
static VALUE rb_pdf417_lib_aspectRatio(VALUE self){
|
225
285
|
pdf417param *ptr;
|
226
286
|
Data_Get_Struct(self, pdf417param, ptr);
|
227
287
|
return rb_float_new(ptr->aspectRatio);
|
@@ -233,7 +293,7 @@ static VALUE rb_pdf417_aspectRatio(VALUE self){
|
|
233
293
|
*
|
234
294
|
* The y/x dot ratio
|
235
295
|
*/
|
236
|
-
static VALUE
|
296
|
+
static VALUE rb_pdf417_lib_yHeight(VALUE self){
|
237
297
|
pdf417param *ptr;
|
238
298
|
Data_Get_Struct(self, pdf417param, ptr);
|
239
299
|
return rb_float_new(ptr->yHeight);
|
@@ -248,34 +308,8 @@ static VALUE rb_pdf417_yHeight(VALUE self){
|
|
248
308
|
* [PDF417_ERROR_TEXT_TOO_BIG] the text was too big the PDF417 specifications
|
249
309
|
* [PDF417_ERROR_INVALID_PARAMS] invalid parameters. Only used with PDF417_USE_RAW_CODEWORDS
|
250
310
|
*/
|
251
|
-
static VALUE
|
311
|
+
static VALUE rb_pdf417_lib_error(VALUE self){
|
252
312
|
pdf417param *ptr;
|
253
313
|
Data_Get_Struct(self, pdf417param, ptr);
|
254
314
|
return INT2NUM(ptr->error);
|
255
315
|
}
|
256
|
-
|
257
|
-
// Refresh the PDF417 struct containing our data if anything important has changed.
|
258
|
-
static void refreshStruct(VALUE self, pdf417param *ptr) {
|
259
|
-
|
260
|
-
char* text = STR2CSTR(rb_iv_get(self, "@text"));
|
261
|
-
int options = 0;
|
262
|
-
VALUE generation_options = rb_iv_get(self, "@generation_options");
|
263
|
-
|
264
|
-
if ( TYPE(generation_options) == T_FIXNUM ){
|
265
|
-
options = FIX2INT(generation_options);
|
266
|
-
}
|
267
|
-
|
268
|
-
// Only re-do it if our text has changed
|
269
|
-
if ( 0 != strcmp(ptr->text, text) || options != ptr->options) {
|
270
|
-
ptr->options = options;
|
271
|
-
ptr->outBits = NULL;
|
272
|
-
ptr->lenBits = 0;
|
273
|
-
ptr->error = 0;
|
274
|
-
ptr->lenText = -1;
|
275
|
-
ptr->text = "";
|
276
|
-
ptr->yHeight = 3;
|
277
|
-
ptr->aspectRatio = 0.5;
|
278
|
-
ptr->text = STR2CSTR(rb_iv_get(self, "@text"));
|
279
|
-
paintCode(ptr); //paintCode also sets the error correction, we call it here so we can get the blob if needed w/o trouble
|
280
|
-
}
|
281
|
-
}
|
data/ext/pdf417/pdf417.h
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
|
2
2
|
VALUE rb_cPdf417;
|
3
|
-
|
4
|
-
static VALUE
|
5
|
-
static VALUE
|
6
|
-
static VALUE
|
7
|
-
static
|
8
|
-
static
|
9
|
-
static VALUE
|
10
|
-
static VALUE
|
11
|
-
static VALUE
|
12
|
-
static VALUE
|
13
|
-
static VALUE
|
14
|
-
static VALUE
|
15
|
-
static VALUE
|
16
|
-
static VALUE
|
17
|
-
static VALUE
|
18
|
-
static
|
3
|
+
VALUE rb_cPdf417_Lib;
|
4
|
+
static VALUE rb_pdf417_lib_encode_text(VALUE self, VALUE text);
|
5
|
+
static VALUE rb_pdf417_lib_codewords(VALUE self);
|
6
|
+
static VALUE rb_pdf417_lib_to_blob(VALUE self);
|
7
|
+
static VALUE rb_pdf417_lib_new(VALUE class, VALUE text);
|
8
|
+
static void rb_pdf417_lib_cleanup(void *p);
|
9
|
+
static VALUE rb_pdf417_lib_init(VALUE self, VALUE text);
|
10
|
+
static VALUE rb_pdf417_lib_bitColumns(VALUE self);
|
11
|
+
static VALUE rb_pdf417_lib_lenBits(VALUE self);
|
12
|
+
static VALUE rb_pdf417_lib_codeRows(VALUE self);
|
13
|
+
static VALUE rb_pdf417_lib_codeColumns(VALUE self);
|
14
|
+
static VALUE rb_pdf417_lib_lenCodewords(VALUE self);
|
15
|
+
static VALUE rb_pdf417_lib_errorLevel(VALUE self);
|
16
|
+
static VALUE rb_pdf417_lib_aspectRatio(VALUE self);
|
17
|
+
static VALUE rb_pdf417_lib_yHeight(VALUE self);
|
18
|
+
static VALUE rb_pdf417_lib_error(VALUE self);
|
data/lib/pdf417.rb
CHANGED
@@ -1,50 +1,232 @@
|
|
1
1
|
require 'pdf417/pdf417'
|
2
|
+
require 'pdf417/lib'
|
2
3
|
|
3
4
|
class PDF417
|
4
5
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
PDF417_INVERT_BITMAP = 128
|
6
|
+
class GenerationError < StandardError; end
|
7
|
+
|
8
|
+
class << self
|
9
|
+
def encode_text(text)
|
10
|
+
PDF417::Lib.encode_text(text)
|
11
|
+
end
|
12
|
+
end
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
attr_accessor :text
|
32
|
-
def inspect # :nodoc:
|
33
|
-
attributes = inspect_attributes.reject { |x|
|
34
|
-
begin
|
35
|
-
attribute = send x
|
36
|
-
!attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
|
37
|
-
rescue NoMethodError
|
38
|
-
true
|
14
|
+
attr_reader :bit_columns, :bit_rows, :bit_length
|
15
|
+
|
16
|
+
def initialize(*attrs)
|
17
|
+
# TODO: Test these defaults, make sure that they can get set on init, check to see that the output changes accordingly
|
18
|
+
self.text = ""
|
19
|
+
@y_height = 3
|
20
|
+
@aspect_ratio = 0.5
|
21
|
+
@rows = 1
|
22
|
+
@cols = 0
|
23
|
+
|
24
|
+
if attrs.first.is_a?(String)
|
25
|
+
self.text = attrs.first
|
26
|
+
elsif attrs.first.is_a?(Hash)
|
27
|
+
attrs.first.each do |k,v|
|
28
|
+
if self.respond_to?("#{k}=".to_sym)
|
29
|
+
self.send("#{k}=".to_sym, v)
|
30
|
+
end
|
39
31
|
end
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
32
|
+
end
|
33
|
+
|
34
|
+
@blob = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def inspect
|
38
|
+
"#<#{self.class.name}:#{self.object_id} >"
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def text=(val)
|
43
|
+
@codewords = @blob = nil
|
44
|
+
@text = val
|
45
|
+
end
|
45
46
|
|
46
|
-
|
47
|
-
|
48
|
-
|
47
|
+
def text
|
48
|
+
if @raw_codewords.nil?
|
49
|
+
@text
|
50
|
+
else
|
51
|
+
""
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def codewords
|
56
|
+
return @raw_codewords if !@raw_codewords.nil?
|
57
|
+
@codewords ||= self.class.encode_text(text)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Y Height
|
61
|
+
def y_height
|
62
|
+
@y_height
|
63
|
+
end
|
64
|
+
def y_height=(val)
|
65
|
+
@blob = nil
|
66
|
+
@y_height = val
|
67
|
+
end
|
68
|
+
|
69
|
+
# Aspect ratio
|
70
|
+
def aspect_ratio
|
71
|
+
@aspect_ratio
|
72
|
+
end
|
73
|
+
def aspect_ratio=(val)
|
74
|
+
@blob = nil
|
75
|
+
@aspect_ratio = val
|
76
|
+
end
|
77
|
+
|
78
|
+
# For setting the codewords directly
|
79
|
+
def raw_codewords
|
80
|
+
@raw_codewords
|
81
|
+
end
|
82
|
+
def raw_codewords=(val)
|
83
|
+
@blob = nil
|
84
|
+
@raw_codewords = val
|
85
|
+
end
|
86
|
+
|
87
|
+
# Make the barcode at least this number of rows
|
88
|
+
def rows
|
89
|
+
@rows
|
90
|
+
end
|
91
|
+
def rows=(val)
|
92
|
+
@blob = nil
|
93
|
+
@rows = val
|
49
94
|
end
|
95
|
+
|
96
|
+
# Make the barcode at least this number of columns
|
97
|
+
def cols
|
98
|
+
@cols
|
99
|
+
end
|
100
|
+
def cols=(val)
|
101
|
+
@blob = nil
|
102
|
+
@cols = val
|
103
|
+
end
|
104
|
+
|
105
|
+
# Request the specified error level must be between 0 and 8
|
106
|
+
def error_level
|
107
|
+
@error_level
|
108
|
+
end
|
109
|
+
def error_level=(val)
|
110
|
+
@blob = nil
|
111
|
+
@error_level = val
|
112
|
+
end
|
113
|
+
|
114
|
+
def generate!
|
115
|
+
lib = Lib.new(text)
|
116
|
+
options = []
|
117
|
+
# Setting the text via accessor will set the codewords to nil, but if they have
|
118
|
+
# been manually set pass them on.
|
119
|
+
if @raw_codewords.is_a?(Array)
|
120
|
+
lib.raw_codewords = @raw_codewords
|
121
|
+
lib.generation_options |= Lib::PDF417_USE_RAW_CODEWORDS
|
122
|
+
options << 'raw codewords'
|
123
|
+
end
|
124
|
+
|
125
|
+
if self.rows.to_i > 0 && self.cols.to_i > 0
|
126
|
+
lib.code_rows = self.rows.to_i
|
127
|
+
lib.code_cols = self.cols.to_i
|
128
|
+
lib.generation_options |= Lib::PDF417_FIXED_RECTANGLE
|
129
|
+
options << "#{rows}x#{cols}"
|
130
|
+
elsif self.rows.to_i > 0
|
131
|
+
lib.code_rows = self.rows.to_i
|
132
|
+
lib.generation_options |= Lib::PDF417_FIXED_ROWS
|
133
|
+
options << "#{rows} rows"
|
134
|
+
elsif self.cols.to_i > 0
|
135
|
+
lib.code_cols = self.cols.to_i
|
136
|
+
lib.generation_options |= Lib::PDF417_FIXED_COLUMNS
|
137
|
+
options << "#{cols} cols"
|
138
|
+
end
|
139
|
+
|
140
|
+
if self.error_level.to_i >= 0 && self.error_level.to_i <= 8
|
141
|
+
lib.error_level = self.error_level.to_i
|
142
|
+
lib.generation_options |= Lib::PDF417_USE_ERROR_LEVEL
|
143
|
+
options << "requested #{error_level.to_i} error level"
|
144
|
+
end
|
145
|
+
|
146
|
+
lib.aspect_ratio = self.aspect_ratio.to_f
|
147
|
+
lib.y_height = self.y_height.to_f
|
148
|
+
|
149
|
+
(@blob = lib.to_blob)
|
150
|
+
if @blob.nil? || @blob.empty?
|
151
|
+
if lib.generation_error == Lib::PDF417_ERROR_TEXT_TOO_BIG
|
152
|
+
raise GenerationError, "Text is too big"
|
153
|
+
elsif lib.generation_error == Lib::PDF417_ERROR_INVALID_PARAMS
|
154
|
+
msg = "Invalid parameters: #{options.join(', ')}"
|
155
|
+
if lib.generation_options & Lib::PDF417_USE_RAW_CODEWORDS && lib.raw_codewords.length != lib.raw_codewords.first
|
156
|
+
msg +=". The first element of the raw codwords must be the length of the array. Currently it is #{lib.raw_codewords.first}, perhaps it should be #{lib.raw_codewords.length}?"
|
157
|
+
end
|
158
|
+
raise GenerationError, msg
|
159
|
+
else
|
160
|
+
raise GenerationError, "Could not generate bitmap error: #{options.join(', ')}"
|
161
|
+
end
|
162
|
+
else
|
163
|
+
@codewords = lib.codewords
|
164
|
+
@bit_columns = lib.bit_columns
|
165
|
+
@bit_rows = ((lib.bit_columns - 1) / 8) + 1
|
166
|
+
@bit_length = lib.bit_length
|
167
|
+
@rows = lib.code_rows
|
168
|
+
@cols = lib.code_cols
|
169
|
+
@error_level = lib.error_level
|
170
|
+
@aspect_ratio = lib.aspect_ratio
|
171
|
+
@y_height = lib.y_height
|
172
|
+
return true
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
|
177
|
+
def to_blob
|
178
|
+
self.generate! if @blob.nil?
|
179
|
+
@blob
|
180
|
+
end
|
181
|
+
alias_method :blob, :to_blob
|
182
|
+
|
183
|
+
def encoding
|
184
|
+
self.generate! if @blob.nil?
|
185
|
+
|
186
|
+
# This matches the output from the pdf417 lib sample output.
|
187
|
+
enc = self.blob.bytes.to_a.each_slice(self.bit_rows).to_a[0..(self.rows-1)] # sometimes we get more rows than expected, truncate
|
188
|
+
|
189
|
+
# The length returned here is too long and we have extra data that gets padded w/ zeroes, meaning it doesn't all match.
|
190
|
+
# Eg, instead of ending with "111111101000101001" it ends with "1111111010001010010000000".
|
191
|
+
return enc.collect do |row_of_bytes|
|
192
|
+
row_of_bytes.collect{|x| sprintf("%08b", x)}.join[0..self.bit_columns-1]
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
def encoding_to_s
|
197
|
+
self.encoding.each{|x| puts x.gsub("0"," ")}
|
198
|
+
end
|
199
|
+
|
200
|
+
def to_png(opts = {})
|
201
|
+
require 'chunky_png' unless defined?(ChunkyPNG)
|
202
|
+
|
203
|
+
self.generate! if @blob.nil?
|
204
|
+
opts[:x_scale] ||= 1
|
205
|
+
opts[:y_scale] ||= 3
|
206
|
+
opts[:margin] ||= 10
|
207
|
+
full_width = (self.bit_columns * opts[:x_scale]) + (opts[:margin] * 2)
|
208
|
+
full_height = (self.rows * opts[:y_scale]) + (opts[:margin] * 2)
|
209
|
+
|
210
|
+
canvas = ChunkyPNG::Image.new(full_width, full_height, ChunkyPNG::Color::WHITE)
|
211
|
+
|
212
|
+
x, y = opts[:margin], opts[:margin]
|
213
|
+
booleans = encoding.map{|l| l.split(//).map{|c| c == '1' } }
|
214
|
+
booleans.each do |line|
|
215
|
+
line.each do |bar|
|
216
|
+
if bar
|
217
|
+
x.upto(x+(opts[:x_scale]-1)) do |xx|
|
218
|
+
y.upto y+(opts[:y_scale]-1) do |yy|
|
219
|
+
canvas[xx,yy] = ChunkyPNG::Color::BLACK
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
x += opts[:x_scale]
|
224
|
+
end
|
225
|
+
y += opts[:y_scale]
|
226
|
+
x = opts[:margin]
|
227
|
+
end
|
228
|
+
canvas.to_datastream.to_s
|
229
|
+
end
|
230
|
+
|
231
|
+
|
50
232
|
end
|
data/lib/pdf417/lib.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'pdf417/pdf417'
|
2
|
+
|
3
|
+
# A barebones ruby interface to the C library, uses C style constants
|
4
|
+
# and mixes in attribute accessors for moving data back and forth
|
5
|
+
class PDF417::Lib
|
6
|
+
|
7
|
+
PDF417_USE_ASPECT_RATIO = 0
|
8
|
+
PDF417_FIXED_RECTANGLE = 1
|
9
|
+
PDF417_FIXED_COLUMNS = 2
|
10
|
+
PDF417_FIXED_ROWS = 4
|
11
|
+
PDF417_AUTO_ERROR_LEVEL = 0
|
12
|
+
PDF417_USE_ERROR_LEVEL = 16
|
13
|
+
PDF417_USE_RAW_CODEWORDS = 64
|
14
|
+
PDF417_INVERT_BITMAP = 128
|
15
|
+
|
16
|
+
PDF417_ERROR_SUCCESS = 0
|
17
|
+
PDF417_ERROR_TEXT_TOO_BIG = 1
|
18
|
+
PDF417_ERROR_INVALID_PARAMS = 2
|
19
|
+
|
20
|
+
# The int representing the options used to generate the barcode, defined in the library as:
|
21
|
+
# [PDF417_USE_ASPECT_RATIO] use aspectRatio to set the y/x dimension. Also uses yHeight
|
22
|
+
# [PDF417_FIXED_RECTANGLE] make the barcode dimensions at least codeColumns by codeRows
|
23
|
+
# [PDF417_FIXED_COLUMNS] make the barcode dimensions at least codeColumns
|
24
|
+
# [PDF417_FIXED_ROWS] make the barcode dimensions at least codeRows
|
25
|
+
# [PDF417_AUTO_ERROR_LEVEL] automatic error level depending on text size
|
26
|
+
# [PDF417_USE_ERROR_LEVEL] the error level is errorLevel. The used errorLevel may be different
|
27
|
+
# [PDF417_USE_RAW_CODEWORDS] use codewords instead of text
|
28
|
+
# [PDF417_INVERT_BITMAP] invert the resulting bitmap
|
29
|
+
#
|
30
|
+
# For example
|
31
|
+
# b.generation_options = PDF417::PDF417_INVERT_BITMAP | PDF417::PDF417_AUTO_ERROR_LEVEL
|
32
|
+
|
33
|
+
attr_accessor :generation_options, :text, :raw_codewords
|
34
|
+
# The following are read from the last generated barcode, but they need a writer because they get set
|
35
|
+
attr_writer :code_rows, :code_cols, :error_level, :y_height, :aspect_ratio
|
36
|
+
def inspect # :nodoc:
|
37
|
+
attributes = inspect_attributes.reject { |x|
|
38
|
+
begin
|
39
|
+
attribute = send x
|
40
|
+
!attribute || (attribute.respond_to?(:empty?) && attribute.empty?)
|
41
|
+
rescue NoMethodError
|
42
|
+
true
|
43
|
+
end
|
44
|
+
}.map { |attribute|
|
45
|
+
"#{attribute.to_s}=#{send(attribute).inspect}"
|
46
|
+
}.join ' '
|
47
|
+
"#<#{self.class.name}:#{sprintf("0x%x", object_id)} #{attributes}>"
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def inspect_attributes
|
52
|
+
[:text, :bit_columns, :bit_length, :code_rows, :code_columns, :codeword_length, :error_level, :generation_options, :aspect_ratio, :y_height, :generation_error]
|
53
|
+
end
|
54
|
+
end
|
data/pdf417.gemspec
CHANGED
@@ -1,18 +1,18 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{pdf417}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["jamesprior"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-07-25}
|
13
13
|
s.description = %q{Generate a series of codewords or a binary blob for PDF417 barcodes}
|
14
14
|
s.email = %q{j.prior@asee.org}
|
15
|
-
s.extensions = ["ext/pdf417/extconf.rb"]
|
15
|
+
s.extensions = ["ext/pdf417/extconf.rb", "ext/pdf417/extconf.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
18
18
|
"README.rdoc"
|
@@ -32,17 +32,21 @@ Gem::Specification.new do |s|
|
|
32
32
|
"ext/pdf417/pdf417lib.h",
|
33
33
|
"ext/pdf417/pdf417libimp.h",
|
34
34
|
"lib/pdf417.rb",
|
35
|
+
"lib/pdf417/lib.rb",
|
35
36
|
"pdf417.gemspec",
|
37
|
+
"script/console",
|
38
|
+
"test/pdf417/lib_test.rb",
|
36
39
|
"test/pdf417_test.rb",
|
37
40
|
"test/test_helper.rb"
|
38
41
|
]
|
39
42
|
s.homepage = %q{http://github.com/asee/pdf417}
|
40
43
|
s.rdoc_options = ["--charset=UTF-8"]
|
41
|
-
s.require_paths = ["lib", "ext"]
|
42
|
-
s.rubygems_version = %q{1.
|
44
|
+
s.require_paths = ["lib", "ext", "ext"]
|
45
|
+
s.rubygems_version = %q{1.5.3}
|
43
46
|
s.summary = %q{A Ruby wrapper for the PDF417 barcode library}
|
44
47
|
s.test_files = [
|
45
|
-
"test/
|
48
|
+
"test/pdf417/lib_test.rb",
|
49
|
+
"test/pdf417_test.rb",
|
46
50
|
"test/test_helper.rb"
|
47
51
|
]
|
48
52
|
|
@@ -55,3 +59,4 @@ Gem::Specification.new do |s|
|
|
55
59
|
else
|
56
60
|
end
|
57
61
|
end
|
62
|
+
|
data/script/console
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
3
|
+
libs = " -r irb/completion"
|
4
|
+
libs << " -I #{File.join(File.dirname(__FILE__), '..', 'lib')}"
|
5
|
+
libs << " -I #{File.join(File.dirname(__FILE__), '..', 'ext')}"
|
6
|
+
libs << " -I #{File.join(File.dirname(__FILE__), '..', '..', 'barby')}"
|
7
|
+
libs << " -r pdf417"
|
8
|
+
libs << " -r rubygems"
|
9
|
+
#libs << " -r chunky_png"
|
10
|
+
exec "#{irb} #{libs} --simple-prompt"
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class PDF417::Lib::LibTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
should "initialize text" do
|
6
|
+
b = PDF417::Lib.new("fred")
|
7
|
+
assert_equal "fred", b.text
|
8
|
+
end
|
9
|
+
|
10
|
+
should "initialize generation_options" do
|
11
|
+
b = PDF417::Lib.new("fred")
|
12
|
+
assert_equal 0, b.generation_options
|
13
|
+
end
|
14
|
+
|
15
|
+
should "know the right codewords for fred" do
|
16
|
+
assert_equal [4, 815, 514, 119], PDF417::Lib.encode_text("fred")
|
17
|
+
assert_equal [4, 815, 514, 119], PDF417::Lib.new("fred").codewords
|
18
|
+
end
|
19
|
+
|
20
|
+
should "re-generate if the text has been reassigned" do
|
21
|
+
b = PDF417::Lib.new("fred")
|
22
|
+
fred_words = b.codewords
|
23
|
+
fred_blob = b.to_blob
|
24
|
+
b.text = "Joebob"
|
25
|
+
assert fred_words != b.codewords
|
26
|
+
assert fred_blob != b.to_blob
|
27
|
+
end
|
28
|
+
|
29
|
+
should "re-generate if the text has been updated" do
|
30
|
+
b = PDF417::Lib.new("fred")
|
31
|
+
fred_words = b.codewords
|
32
|
+
fred_blob = b.to_blob
|
33
|
+
b.text += " and joe"
|
34
|
+
assert fred_words != b.codewords
|
35
|
+
assert fred_blob != b.to_blob
|
36
|
+
end
|
37
|
+
|
38
|
+
should "re-generate if the options have changed" do
|
39
|
+
b = PDF417::Lib.new("fred")
|
40
|
+
fred_words = b.codewords
|
41
|
+
fred_blob = b.to_blob
|
42
|
+
b.generation_options = PDF417::Lib::PDF417_INVERT_BITMAP
|
43
|
+
assert_equal b.generation_options, PDF417::Lib::PDF417_INVERT_BITMAP
|
44
|
+
assert_equal fred_words, b.codewords # NOTE that the codewords have not changed, just the binary blob
|
45
|
+
assert fred_blob != b.to_blob
|
46
|
+
end
|
47
|
+
|
48
|
+
should "work when generation options are set weird" do
|
49
|
+
b = PDF417::Lib.new("fred")
|
50
|
+
b.generation_options = "ALBERT"
|
51
|
+
assert b.codewords.is_a?(Array)
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
end
|
data/test/pdf417_test.rb
CHANGED
@@ -1,23 +1,28 @@
|
|
1
|
+
begin
|
2
|
+
require "RMagick"
|
3
|
+
rescue LoadError
|
4
|
+
end
|
5
|
+
|
1
6
|
require 'test_helper'
|
2
7
|
|
3
8
|
class Pdf417Test < Test::Unit::TestCase
|
4
9
|
|
5
|
-
should "initialize text" do
|
6
|
-
b = PDF417.new("fred")
|
10
|
+
should "initialize text as an attr" do
|
11
|
+
b = PDF417.new(:text => "fred")
|
7
12
|
assert_equal "fred", b.text
|
8
13
|
end
|
9
14
|
|
10
|
-
should "initialize
|
15
|
+
should "initialize text as a single parameter" do
|
11
16
|
b = PDF417.new("fred")
|
12
|
-
assert_equal
|
17
|
+
assert_equal "fred", b.text
|
13
18
|
end
|
14
|
-
|
19
|
+
|
15
20
|
should "know the right codewords for fred" do
|
16
21
|
assert_equal [4, 815, 514, 119], PDF417.encode_text("fred")
|
17
|
-
assert_equal [4, 815, 514, 119], PDF417.new("fred").codewords
|
22
|
+
assert_equal [4, 815, 514, 119], PDF417.new(:text => "fred").codewords
|
18
23
|
end
|
19
24
|
|
20
|
-
should "re-generate if the text has been reassigned" do
|
25
|
+
should "re-generate codewords if the text has been reassigned" do
|
21
26
|
b = PDF417.new("fred")
|
22
27
|
fred_words = b.codewords
|
23
28
|
fred_blob = b.to_blob
|
@@ -39,17 +44,137 @@ class Pdf417Test < Test::Unit::TestCase
|
|
39
44
|
b = PDF417.new("fred")
|
40
45
|
fred_words = b.codewords
|
41
46
|
fred_blob = b.to_blob
|
42
|
-
b.
|
43
|
-
assert_equal b.generation_options, PDF417::PDF417_INVERT_BITMAP
|
47
|
+
b.rows = b.rows + 4
|
44
48
|
assert_equal fred_words, b.codewords # NOTE that the codewords have not changed, just the binary blob
|
45
49
|
assert fred_blob != b.to_blob
|
46
50
|
end
|
47
51
|
|
48
|
-
should "
|
49
|
-
b = PDF417.new("
|
50
|
-
b.
|
51
|
-
|
52
|
+
should "set the text to nil when using raw codewords" do
|
53
|
+
b = PDF417.new("TEST")
|
54
|
+
b.raw_codewords = [4, 815, 514, 119]
|
55
|
+
assert_equal "", b.text
|
56
|
+
end
|
57
|
+
|
58
|
+
should "accept raw codewords" do
|
59
|
+
b = PDF417.new
|
60
|
+
b.raw_codewords = [4, 815, 514, 119]
|
61
|
+
assert_equal [4, 815, 514, 119], b.codewords
|
62
|
+
assert_nothing_raised do
|
63
|
+
b.to_blob
|
64
|
+
end
|
65
|
+
assert_barcode b
|
52
66
|
end
|
53
67
|
|
68
|
+
context "after generating" do
|
69
|
+
setup do
|
70
|
+
@barcode = PDF417.new("test")
|
71
|
+
@barcode.generate!
|
72
|
+
@blob = @barcode.blob
|
73
|
+
end
|
74
|
+
|
75
|
+
should "have a blob" do
|
76
|
+
assert_not_nil @barcode.blob
|
77
|
+
assert_not_nil @barcode.to_blob
|
78
|
+
assert_barcode @barcode
|
79
|
+
end
|
80
|
+
|
81
|
+
should "know bit columns" do
|
82
|
+
assert_not_nil @barcode.bit_columns
|
83
|
+
end
|
84
|
+
|
85
|
+
should "know bit rows" do
|
86
|
+
assert_not_nil @barcode.bit_rows
|
87
|
+
end
|
88
|
+
|
89
|
+
should "know bit length" do
|
90
|
+
assert_not_nil @barcode.bit_length
|
91
|
+
end
|
92
|
+
|
93
|
+
should "know rows" do
|
94
|
+
assert_not_nil @barcode.rows
|
95
|
+
end
|
96
|
+
|
97
|
+
should "know cols" do
|
98
|
+
assert_not_nil @barcode.cols
|
99
|
+
end
|
100
|
+
|
101
|
+
should "know error level" do
|
102
|
+
assert_not_nil @barcode.error_level
|
103
|
+
end
|
104
|
+
|
105
|
+
should "know aspect ratio" do
|
106
|
+
assert_not_nil @barcode.aspect_ratio
|
107
|
+
end
|
108
|
+
|
109
|
+
should "know y height" do
|
110
|
+
assert_not_nil @barcode.y_height
|
111
|
+
end
|
112
|
+
|
113
|
+
should "regenerate after rows changed" do
|
114
|
+
@barcode.rows = 10
|
115
|
+
assert_not_equal @blob, @barcode.to_blob
|
116
|
+
assert_barcode @barcode
|
117
|
+
end
|
118
|
+
|
119
|
+
should "regenerate after cols changed" do
|
120
|
+
@barcode.cols = 10
|
121
|
+
assert_not_equal @blob, @barcode.to_blob
|
122
|
+
assert_barcode @barcode
|
123
|
+
end
|
124
|
+
|
125
|
+
should "regenerate after error level changed" do
|
126
|
+
@barcode.error_level = 7
|
127
|
+
assert_not_equal @blob, @barcode.to_blob
|
128
|
+
assert_barcode_start_sequence @barcode
|
129
|
+
assert_barcode_end_sequence @barcode
|
130
|
+
end
|
131
|
+
|
132
|
+
should "regenerate after raw codewords changed" do
|
133
|
+
@barcode.raw_codewords = @barcode.codewords + [245, 123]
|
134
|
+
@barcode.raw_codewords[0] = @barcode.raw_codewords.length
|
135
|
+
assert_not_equal @blob, @barcode.to_blob
|
136
|
+
assert_barcode @barcode
|
137
|
+
end
|
138
|
+
|
139
|
+
should "regenerate after aspect ratio changed" do
|
140
|
+
# Aspect ratio does not apply when both rows and cols are set, so re-set our
|
141
|
+
# reference and make sure there is enough data to have rows and cols
|
142
|
+
@barcode.text = "SOME REALLY LONG TEXT HERE! Gonna need some rows...." * 10
|
143
|
+
@barcode.rows = nil
|
144
|
+
@barcode.cols = 2
|
145
|
+
@barcode.error_level = 3
|
146
|
+
@blob = @barcode.to_blob
|
147
|
+
@barcode.aspect_ratio = 1000
|
148
|
+
assert_not_equal @blob, @barcode.to_blob
|
149
|
+
assert_barcode_start_sequence @barcode
|
150
|
+
assert_barcode_end_sequence @barcode
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
should "know max rows after generating out of bounds" do
|
155
|
+
b = PDF417.new(:rows => 10000, :text => "test")
|
156
|
+
b.generate!
|
157
|
+
assert_not_equal 10000, b.rows
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
# if Object.const_defined? "Magick"
|
162
|
+
# context "using RMagick" do
|
163
|
+
# setup do
|
164
|
+
# @barcode = PDF417.new("test text" * 100)
|
165
|
+
# @barcode.generate!
|
166
|
+
# end
|
167
|
+
#
|
168
|
+
# should "make an image" do
|
169
|
+
# # @barcode.to_blob.split(//).collect{|x| x.unpack("B*")}.to_s.inspect
|
170
|
+
# image = Magick::Image::from_blob(@barcode.to_blob).first
|
171
|
+
# puts "Width: #{image.columns}; Height: #{image.rows}"
|
172
|
+
# end
|
173
|
+
# end
|
174
|
+
# else
|
175
|
+
# puts "*** Skipping rmagick tests"
|
176
|
+
# end
|
177
|
+
|
178
|
+
|
54
179
|
|
55
180
|
end
|
data/test/test_helper.rb
CHANGED
@@ -7,7 +7,30 @@ require 'pdf417'
|
|
7
7
|
require 'rubygems'
|
8
8
|
require 'test/unit'
|
9
9
|
require 'shoulda'
|
10
|
+
require 'ruby-debug'
|
10
11
|
|
11
12
|
|
12
13
|
class Test::Unit::TestCase
|
13
14
|
end
|
15
|
+
|
16
|
+
def assert_barcode(barcode, msg = nil)
|
17
|
+
full_message = build_message(msg, "? should have a valid PDF417 start and end sequence for each row", barcode)
|
18
|
+
assert_block(full_message) do
|
19
|
+
barcode.encoding.any? && barcode.encoding.all?{|x| x.start_with?("11111111010101000") && x.end_with?("111111101000101001") }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def assert_barcode_start_sequence(barcode, msg = nil)
|
24
|
+
full_message = build_message(msg, "? should have a valid PDF417 start sequence for each row", barcode)
|
25
|
+
assert_block(full_message) do
|
26
|
+
barcode.encoding.any? && barcode.encoding.all?{|x| x.start_with?("11111111010101000")}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
|
31
|
+
def assert_barcode_end_sequence(barcode, msg = nil)
|
32
|
+
full_message = build_message(msg, "? should have a valid PDF417 end sequence for each row", barcode)
|
33
|
+
assert_block(full_message) do
|
34
|
+
barcode.encoding.any? && barcode.encoding.all?{|x| x.end_with?("111111101000101001") }
|
35
|
+
end
|
36
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdf417
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 0.2.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- jamesprior
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-07-25 00:00:00 -05:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -25,6 +25,7 @@ executables: []
|
|
25
25
|
|
26
26
|
extensions:
|
27
27
|
- ext/pdf417/extconf.rb
|
28
|
+
- ext/pdf417/extconf.rb
|
28
29
|
extra_rdoc_files:
|
29
30
|
- LICENSE
|
30
31
|
- README.rdoc
|
@@ -43,7 +44,10 @@ files:
|
|
43
44
|
- ext/pdf417/pdf417lib.h
|
44
45
|
- ext/pdf417/pdf417libimp.h
|
45
46
|
- lib/pdf417.rb
|
47
|
+
- lib/pdf417/lib.rb
|
46
48
|
- pdf417.gemspec
|
49
|
+
- script/console
|
50
|
+
- test/pdf417/lib_test.rb
|
47
51
|
- test/pdf417_test.rb
|
48
52
|
- test/test_helper.rb
|
49
53
|
has_rdoc: true
|
@@ -56,6 +60,7 @@ rdoc_options:
|
|
56
60
|
require_paths:
|
57
61
|
- lib
|
58
62
|
- ext
|
63
|
+
- ext
|
59
64
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
65
|
none: false
|
61
66
|
requirements:
|
@@ -77,10 +82,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
77
82
|
requirements: []
|
78
83
|
|
79
84
|
rubyforge_project:
|
80
|
-
rubygems_version: 1.
|
85
|
+
rubygems_version: 1.5.3
|
81
86
|
signing_key:
|
82
87
|
specification_version: 3
|
83
88
|
summary: A Ruby wrapper for the PDF417 barcode library
|
84
89
|
test_files:
|
90
|
+
- test/pdf417/lib_test.rb
|
85
91
|
- test/pdf417_test.rb
|
86
92
|
- test/test_helper.rb
|