-
-
Notifications
You must be signed in to change notification settings - Fork 67
/
Copy pathonecode.ps.src
385 lines (357 loc) · 15.7 KB
/
onecode.ps.src
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
% Barcode Writer in Pure PostScript
% https://bwipp.terryburton.co.uk
%
% Copyright (c) 2004-2024 Terry Burton
%
% $Id$
%
% Permission is hereby granted, free of charge, to any
% person obtaining a copy of this software and associated
% documentation files (the "Software"), to deal in the
% Software without restriction, including without
% limitation the rights to use, copy, modify, merge,
% publish, distribute, sublicense, and/or sell copies of
% the Software, and to permit persons to whom the Software
% is furnished to do so, subject to the following
% conditions:
%
% The above copyright notice and this permission notice
% shall be included in all copies or substantial portions
% of the Software.
%
% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
% KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
% THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
% PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
% THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
% DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
% CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
% CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
% IN THE SOFTWARE.
% --BEGIN ENCODER onecode--
% --REQUIRES preamble loadctx unloadctx raiseerror processoptions renlinear--
% --DESC: USPS Intelligent Mail
% --EXAM: 0123456709498765432101234567891
% --EXOP: barcolor=FF0000
% --RNDR: renlinear
/setpacking where {pop currentpacking true setpacking} if
10 dict
dup /loadctx dup /uk.co.terryburton.bwipp findresource put
dup /unloadctx dup /uk.co.terryburton.bwipp findresource put
dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
dup /processoptions dup /uk.co.terryburton.bwipp findresource put
dup /renlinear dup /uk.co.terryburton.bwipp findresource put
begin
/onecode {
20 dict begin
/ctx null def
/dontdraw false def
/height 0.15 def
//processoptions exec /options exch def
/barcode exch def
/onecode //loadctx exec
/barlen barcode length def
barcode {
dup 48 lt exch 57 gt or {
/bwipp.onecodeBadCharacter (The data must contain only digits) //raiseerror exec
} if
} forall
barlen 20 ne barlen 25 ne and barlen 29 ne and barlen 31 ne and {
/bwipp.onecodeInvalidLength (The data must be 20, 25, 29 or 31 digits) //raiseerror exec
} if
% Create the human readable text
/txtdict <<
2 dup
5 dup
barcode 5 1 getinterval (9) eq {14} {11} ifelse dup
20 dup
25 dup
29 dup
>> def
/txt barlen 6 add array def
/spacecnt 0 def
0 1 barlen 1 sub {
/i exch def
txtdict i known {
txt i spacecnt add [( ) 0 0 () 0] put
/spacecnt spacecnt 1 add def
} if
txt i spacecnt add [barcode i 1 getinterval 0 0 () 0] put
} for
/txt txt 0 barcode length spacecnt add getinterval def
/normalize {
/base exch def
/num exch def
num length 1 sub -1 1 {
/i exch def
num i 1 sub 2 copy get num i get base idiv add put
num i num i get base mod put
} for
{ %loop - extend input as necessary
num 0 get base lt {exit} if
/num [ 0 num aload pop ] def
num 0 num 0 get num 1 get base idiv add put
num 1 num 1 get base mod put
} loop
% Trim leading zeros
/num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def
num length 0 eq {/num [0] def} if
num
} def
/bigadd {
2 copy length exch length
2 copy sub abs /offset exch def
lt {exch} if
/a exch def /b exch def
0 1 b length 1 sub {
dup a exch offset add 2 copy get b 5 -1 roll get add put
} for
a
} def
% Conversion of data fields into binary data
{
/startvals <<
20 [0]
25 [1]
29 [1 0 0 0 0 1]
31 [1 0 0 0 1 0 0 0 0 1]
>> def
} ctxdef
/binval startvals barlen get [barcode 20 barlen 20 sub getinterval {48 sub} forall] bigadd def
/binval [binval aload pop barcode 0 get 48 sub] def
/binval [binval {5 mul} forall] [barcode 1 get 48 sub] bigadd 10 normalize def
/binval [binval aload pop barcode 2 18 getinterval {48 sub} forall] def
% Conversion of binary data into byte array
/bytes 13 array def
/bintmp binval dup length array copy def
12 -1 0 {
/i exch def
0 1 bintmp length 2 sub {
/j exch def
bintmp j 1 add 2 copy get bintmp j get 256 mod 10 mul add put
bintmp j bintmp j get 256 idiv put
} for
bytes i bintmp bintmp length 1 sub get 256 mod put
bintmp bintmp length 1 sub 2 copy get 256 idiv put
} for
% Generation of 11-bit CRC on byte array
/fcs 2047 def
/dat bytes 0 get 5 bitshift def
6 {
fcs dat xor 1024 and 0 ne {
/fcs fcs 1 bitshift 3893 xor def
} {
/fcs fcs 1 bitshift def
} ifelse
/fcs fcs 2047 and def
/dat dat 1 bitshift def
} repeat
1 1 12 {
bytes exch get 3 bitshift /dat exch def
8 {
fcs dat xor 1024 and 0 ne {
/fcs fcs 1 bitshift 3893 xor def
} {
/fcs fcs 1 bitshift def
} ifelse
/fcs fcs 2047 and def
/dat dat 1 bitshift def
} repeat
} for
% Conversion from binary data to codewords
/codewords 10 array def
9 -1 0 {
/i exch def
/b i 9 eq { 636 } { 1365 } ifelse def
0 1 binval length 2 sub {
/j exch def
binval j 1 add 2 copy get binval j get b mod 10 mul add put
binval j binval j get b idiv put
} for
codewords i binval binval length 1 sub get b mod put
binval binval length 1 sub 2 copy get b idiv put
} for
% Inserting additional information into codewords
codewords 9 codewords 9 get 2 mul put
fcs 1024 and 0 ne {
codewords 0 codewords 0 get 659 add put
} if
% Conversion from codewords to characters
{
/tab513 [
31 7936 47 7808 55 7552 59 7040 61 6016 62 3968 79 7744 87
7488 91 6976 93 5952 94 3904 103 7360 107 6848 109 5824 110 3776
115 6592 117 5568 118 3520 121 5056 122 3008 124 1984 143 7712 151
7456 155 6944 157 5920 158 3872 167 7328 171 6816 173 5792 174 3744
179 6560 181 5536 182 3488 185 5024 186 2976 188 1952 199 7264 203
6752 205 5728 206 3680 211 6496 213 5472 214 3424 217 4960 218 2912
220 1888 227 6368 229 5344 230 3296 233 4832 234 2784 236 1760 241
4576 242 2528 244 1504 248 992 271 7696 279 7440 283 6928 285 5904
286 3856 295 7312 299 6800 301 5776 302 3728 307 6544 309 5520 310
3472 313 5008 314 2960 316 1936 327 7248 331 6736 333 5712 334 3664
339 6480 341 5456 342 3408 345 4944 346 2896 348 1872 355 6352 357
5328 358 3280 361 4816 362 2768 364 1744 369 4560 370 2512 372 1488
376 976 391 7216 395 6704 397 5680 398 3632 403 6448 405 5424 406
3376 409 4912 410 2864 412 1840 419 6320 421 5296 422 3248 425 4784
426 2736 428 1712 433 4528 434 2480 436 1456 440 944 451 6256 453
5232 454 3184 457 4720 458 2672 460 1648 465 4464 466 2416 468 1392
472 880 481 4336 482 2288 484 1264 488 752 527 7688 535 7432 539
6920 541 5896 542 3848 551 7304 555 6792 557 5768 558 3720 563 6536
565 5512 566 3464 569 5000 570 2952 572 1928 583 7240 587 6728 589
5704 590 3656 595 6472 597 5448 598 3400 601 4936 602 2888 604 1864
611 6344 613 5320 614 3272 617 4808 618 2760 620 1736 625 4552 626
2504 628 1480 632 968 647 7208 651 6696 653 5672 654 3624 659 6440
661 5416 662 3368 665 4904 666 2856 668 1832 675 6312 677 5288 678
3240 681 4776 682 2728 684 1704 689 4520 690 2472 692 1448 696 936
707 6248 709 5224 710 3176 713 4712 714 2664 716 1640 721 4456 722
2408 724 1384 728 872 737 4328 738 2280 740 1256 775 7192 779 6680
781 5656 782 3608 787 6424 789 5400 790 3352 793 4888 794 2840 796
1816 803 6296 805 5272 806 3224 809 4760 810 2712 812 1688 817 4504
818 2456 820 1432 824 920 835 6232 837 5208 838 3160 841 4696 842
2648 844 1624 849 4440 850 2392 852 1368 865 4312 866 2264 868 1240
899 6200 901 5176 902 3128 905 4664 906 2616 908 1592 913 4408 914
2360 916 1336 929 4280 930 2232 932 1208 961 4216 962 2168 964 1144
1039 7684 1047 7428 1051 6916 1053 5892 1054 3844 1063 7300 1067 6788 1069
5764 1070 3716 1075 6532 1077 5508 1078 3460 1081 4996 1082 2948 1084 1924
1095 7236 1099 6724 1101 5700 1102 3652 1107 6468 1109 5444 1110 3396 1113
4932 1114 2884 1116 1860 1123 6340 1125 5316 1126 3268 1129 4804 1130 2756
1132 1732 1137 4548 1138 2500 1140 1476 1159 7204 1163 6692 1165 5668 1166
3620 1171 6436 1173 5412 1174 3364 1177 4900 1178 2852 1180 1828 1187 6308
1189 5284 1190 3236 1193 4772 1194 2724 1196 1700 1201 4516 1202 2468 1204
1444 1219 6244 1221 5220 1222 3172 1225 4708 1226 2660 1228 1636 1233 4452
1234 2404 1236 1380 1249 4324 1250 2276 1287 7188 1291 6676 1293 5652 1294
3604 1299 6420 1301 5396 1302 3348 1305 4884 1306 2836 1308 1812 1315 6292
1317 5268 1318 3220 1321 4756 1322 2708 1324 1684 1329 4500 1330 2452 1332
1428 1347 6228 1349 5204 1350 3156 1353 4692 1354 2644 1356 1620 1361 4436
1362 2388 1377 4308 1378 2260 1411 6196 1413 5172 1414 3124 1417 4660 1418
2612 1420 1588 1425 4404 1426 2356 1441 4276 1442 2228 1473 4212 1474 2164
1543 7180 1547 6668 1549 5644 1550 3596 1555 6412 1557 5388 1558 3340 1561
4876 1562 2828 1564 1804 1571 6284 1573 5260 1574 3212 1577 4748 1578 2700
1580 1676 1585 4492 1586 2444 1603 6220 1605 5196 1606 3148 1609 4684 1610
2636 1617 4428 1618 2380 1633 4300 1634 2252 1667 6188 1669 5164 1670 3116
1673 4652 1674 2604 1681 4396 1682 2348 1697 4268 1698 2220 1729 4204 1730
2156 1795 6172 1797 5148 1798 3100 1801 4636 1802 2588 1809 4380 1810 2332
1825 4252 1826 2204 1857 4188 1858 2140 1921 4156 1922 2108 2063 7682 2071
7426 2075 6914 2077 5890 2078 3842 2087 7298 2091 6786 2093 5762 2094 3714
2099 6530 2101 5506 2102 3458 2105 4994 2106 2946 2119 7234 2123 6722 2125
5698 2126 3650 2131 6466 2133 5442 2134 3394 2137 4930 2138 2882 2147 6338
2149 5314 2150 3266 2153 4802 2154 2754 2161 4546 2162 2498 2183 7202 2187
6690 2189 5666 2190 3618 2195 6434 2197 5410 2198 3362 2201 4898 2202 2850
2211 6306 2213 5282 2214 3234 2217 4770 2218 2722 2225 4514 2226 2466 2243
6242 2245 5218 2246 3170 2249 4706 2250 2658 2257 4450 2258 2402 2273 4322
2311 7186 2315 6674 2317 5650 2318 3602 2323 6418 2325 5394 2326 3346 2329
4882 2330 2834 2339 6290 2341 5266 2342 3218 2345 4754 2346 2706 2353 4498
2354 2450 2371 6226 2373 5202 2374 3154 2377 4690 2378 2642 2385 4434 2401
4306 2435 6194 2437 5170 2438 3122 2441 4658 2442 2610 2449 4402 2465 4274
2497 4210 2567 7178 2571 6666 2573 5642 2574 3594 2579 6410 2581 5386 2582
3338 2585 4874 2586 2826 2595 6282 2597 5258 2598 3210 2601 4746 2602 2698
2609 4490 2627 6218 2629 5194 2630 3146 2633 4682 2641 4426 2657 4298 2691
6186 2693 5162 2694 3114 2697 4650 2705 4394 2721 4266 2753 4202 2819 6170
2821 5146 2822 3098 2825 4634 2833 4378 2849 4250 2881 4186 2945 4154 3079
7174 3083 6662 3085 5638 3086 3590 3091 6406 3093 5382 3094 3334 3097 4870
3107 6278 3109 5254 3110 3206 3113 4742 3121 4486 3139 6214 3141 5190 3145
4678 3153 4422 3169 4294 3203 6182 3205 5158 3209 4646 3217 4390 3233 4262
3265 4198 3331 6166 3333 5142 3337 4630 3345 4374 3361 4246 3393 4182 3457
4150 3587 6158 3589 5134 3593 4622 3601 4366 3617 4238 3649 4174 3713 4142
3841 4126 4111 7681 4119 7425 4123 6913 4125 5889 4135 7297 4139 6785 4141
5761 4147 6529 4149 5505 4153 4993 4167 7233 4171 6721 4173 5697 4179 6465
4181 5441 4185 4929 4195 6337 4197 5313 4201 4801 4209 4545 4231 7201 4235
6689 4237 5665 4243 6433 4245 5409 4249 4897 4259 6305 4261 5281 4265 4769
4273 4513 4291 6241 4293 5217 4297 4705 4305 4449 4359 7185 4363 6673 4365
5649 4371 6417 4373 5393 4377 4881 4387 6289 4389 5265 4393 4753 4401 4497
4419 6225 4421 5201 4425 4689 4483 6193 4485 5169 4489 4657 4615 7177 4619
6665 4621 5641 4627 6409 4629 5385 4633 4873 4643 6281 4645 5257 4649 4745
4675 6217 4677 5193 4739 6185 4741 5161 4867 6169 4869 5145 5127 7173 5131
6661 5133 5637 5139 6405 5141 5381 5155 6277 5157 5253 5187 6213 5251 6181
5379 6165 5635 6157 6151 7171 6155 6659 6163 6403 6179 6275 6211 5189 4681
4433 4321 3142 2634 2386 2274 1612 1364 1252 856 744 496
] def
/tab213 [
3 6144 5 5120 6 3072 9 4608 10 2560 12 1536 17 4352 18
2304 20 1280 24 768 33 4224 34 2176 36 1152 40 640 48 384
65 4160 66 2112 68 1088 72 576 80 320 96 192 129 4128 130
2080 132 1056 136 544 144 288 257 4112 258 2064 260 1040 264 528
513 4104 514 2056 516 1032 1025 4100 1026 2052 2049 4098 4097 2050 1028
520 272 160
] def
} ctxdef
/chars 10 array def
0 1 9 {
/i exch def
codewords i get dup 1286 le {
tab513 exch get
} {
tab213 exch 1287 sub get
} ifelse
chars i 3 -1 roll put
} for
9 -1 0 {
/i exch def
2 i exp cvi fcs and 0 ne {
chars i chars i get 8191 xor put
} if
} for
% Conversion from characters to the OneCode encoding
{
/barmap [
7 2 4 3 1 10 0 0 9 12 2 8 5 5 6 11 8 9 3 1
0 1 5 12 2 5 1 8 4 4 9 11 6 3 8 10 3 9 7 6
5 11 1 4 8 5 2 12 9 10 0 2 7 1 6 7 3 6 4 9
0 3 8 6 6 4 2 7 1 1 9 9 7 10 5 2 4 0 3 8
6 2 0 4 8 11 1 0 9 8 3 12 2 6 7 7 5 1 4 10
1 12 6 9 7 3 8 0 5 8 9 7 4 6 2 10 3 4 0 5
8 4 5 7 7 11 1 9 6 0 9 6 0 6 4 8 2 1 3 2
5 9 8 12 4 11 6 1 9 5 7 4 3 3 1 2 0 7 2 0
1 3 4 1 6 10 3 5 8 7 9 4 2 11 5 6 0 8 7 12
4 2 8 1 5 10 3 0 9 3 0 9 6 5 2 4 7 8 1 7
5 0 4 5 2 3 0 10 6 12 9 2 3 11 1 6 8 8 7 9
5 4 0 11 1 5 2 2 9 1 4 12 8 3 6 6 7 0 3 7
4 7 7 5 0 12 1 11 2 9 9 0 6 8 5 3 3 10 8 2
] def
} ctxdef
/bbs 65 array def
/bhs 65 array def
0 1 64 {
/i exch def
/dec chars barmap i 4 mul get get 2 barmap i 4 mul 1 add get exp cvi and 0 ne def
/asc chars barmap i 4 mul 2 add get get 2 barmap i 4 mul 3 add get exp cvi and 0 ne def
dec not asc not and {
bbs i 3 height mul 8 div put
bhs i 2 height mul 8 div put
} if
dec not asc and {
bbs i 3 height mul 8 div put
bhs i 5 height mul 8 div put
} if
dec asc not and {
bbs i 0 height mul 8 div put
bhs i 5 height mul 8 div put
} if
dec asc and {
bbs i 0 height mul 8 div put
bhs i 8 height mul 8 div put
} if
} for
% Return the arguments
<<
/ren /renlinear
/bbs bbs
/bhs bhs
/sbs [bhs length 1 sub {1.44 1.872} repeat 1.44]
/txt txt
/textxalign (left)
/textfont /Helvetica
/textyoffset 1.0
/textxoffset -0.3
/opt options
>>
dontdraw not //renlinear if
//unloadctx exec
end
}
[/barcode] {null def} forall
bind def
/onecode dup load /uk.co.terryburton.bwipp defineresource pop
end
/setpacking where {pop setpacking} if
% --END ENCODER onecode--