line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
#!/bin/perl |
2
|
|
|
|
|
|
|
# |
3
|
|
|
|
|
|
|
# @(#)Labels.pm 1.8 01/02/10 |
4
|
|
|
|
|
|
|
# |
5
|
|
|
|
|
|
|
# Perl package of routines to produce mailing label PDFs |
6
|
|
|
|
|
|
|
# |
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
# PDF::Labels - create Mailing Labels in PDF files |
9
|
|
|
|
|
|
|
# Author: Owen DeLong |
10
|
|
|
|
|
|
|
# Version: 0.01 |
11
|
|
|
|
|
|
|
# Copyright 2001 Owen DeLong |
12
|
|
|
|
|
|
|
# |
13
|
|
|
|
|
|
|
# bugs: |
14
|
|
|
|
|
|
|
# - ... |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
package PDF::Labels; |
17
|
|
|
|
|
|
|
|
18
|
1
|
|
|
1
|
|
2119
|
use PDF::Create; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
use strict; |
20
|
|
|
|
|
|
|
use vars qw(@ISA @EXPORT $VERSION $DEBUG); |
21
|
|
|
|
|
|
|
use Exporter; |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
@ISA = qw(Exporter); |
24
|
|
|
|
|
|
|
@EXPORT = qw(); |
25
|
|
|
|
|
|
|
$VERSION = 1.8; |
26
|
|
|
|
|
|
|
$DEBUG = 0; |
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
# Remainder of code appears at end of documentation |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
=head1 NAME |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
PDF::Labels - Routines to produce formatted pages of mailing labels in PDF |
33
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=head1 SYNOPSIS |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
use PDF::Labels; |
37
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
Requires: PDF::Create |
39
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
=head1 DESCRIPTION |
41
|
|
|
|
|
|
|
|
42
|
|
|
|
|
|
|
=head2 GENERAL |
43
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
Provides package PDF::Labels |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
Package Global Variables: |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
@PDF::Labels:PageFormats is a list of known page formats. Each |
49
|
|
|
|
|
|
|
page format is a : delimited list of fields which provide the |
50
|
|
|
|
|
|
|
following properties about a page of labels: |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
pagewidth Width of actual page in inches |
53
|
|
|
|
|
|
|
pageheight Height of actual page in inches |
54
|
|
|
|
|
|
|
pagexoffset Offset from left edge of page to left |
55
|
|
|
|
|
|
|
edge of first column of labels in inches |
56
|
|
|
|
|
|
|
pageyoffset Offset from bottom edge of page to |
57
|
|
|
|
|
|
|
bottom edge of lowest row of labels |
58
|
|
|
|
|
|
|
xlabels Number of labels in each row |
59
|
|
|
|
|
|
|
ylabels Number of labels in each column |
60
|
|
|
|
|
|
|
labelwidth Width of each label in inches, including |
61
|
|
|
|
|
|
|
margin |
62
|
|
|
|
|
|
|
labelheight Height of each label in inches, including |
63
|
|
|
|
|
|
|
margin |
64
|
|
|
|
|
|
|
labelxmar Minimum Distance to offset printing from |
65
|
|
|
|
|
|
|
left and right edges of label |
66
|
|
|
|
|
|
|
labelymar Minimum distance to offset printing from |
67
|
|
|
|
|
|
|
top and bottom edges of label |
68
|
|
|
|
|
|
|
fontsize Size of font to use with this label |
69
|
|
|
|
|
|
|
linespacing Line spacing (points) to use with this |
70
|
|
|
|
|
|
|
label |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
=head2 SYNTAX |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
Example |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
use PDF::Create; |
77
|
|
|
|
|
|
|
use PDF::Labels; |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
$pdf = new PDF::Labels( |
80
|
|
|
|
|
|
|
$PDF::Labels::PageFormats[0], |
81
|
|
|
|
|
|
|
filename=>'labels.pdf', |
82
|
|
|
|
|
|
|
Author=>'PDF Labelmaker', |
83
|
|
|
|
|
|
|
Title=>'My Labels' |
84
|
|
|
|
|
|
|
); |
85
|
|
|
|
|
|
|
|
86
|
|
|
|
|
|
|
$pdf->setlabel(5); # Start with label 5 on first page |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
$pdf->label('John Doe', '1234 Some Street', |
89
|
|
|
|
|
|
|
'Anytown, ID', '12345'); |
90
|
|
|
|
|
|
|
$pdf->label('Jane Doe', '5493 Other Drive', |
91
|
|
|
|
|
|
|
'Nowhere, CA', '92213'); |
92
|
|
|
|
|
|
|
$pdf->label('Bob Smith', '392 Cedar Lane', |
93
|
|
|
|
|
|
|
'Deep Shit, AR', '72134'); |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
$pdf->close(); |
96
|
|
|
|
|
|
|
|
97
|
|
|
|
|
|
|
The above example will produce 3 labels on an 8.5x11 sheet with |
98
|
|
|
|
|
|
|
three labels in a row and 10 rows of labels. The labels are |
99
|
|
|
|
|
|
|
2.625"x1". This is a common sheet-feed label. In this case, the |
100
|
|
|
|
|
|
|
three labels will be the last label of the second row and the |
101
|
|
|
|
|
|
|
first two labels of the third row. The labels can be moved by |
102
|
|
|
|
|
|
|
changing the parameter to the setlabel call. |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
Creation |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
$pdf = new PDF::Labels( |
107
|
|
|
|
|
|
|
$PageFormat, |
108
|
|
|
|
|
|
|
PDF::Create parameters |
109
|
|
|
|
|
|
|
) |
110
|
|
|
|
|
|
|
|
111
|
|
|
|
|
|
|
$PageFormat is a string containing a single element of PageFormats |
112
|
|
|
|
|
|
|
or a custom page format specification in the same format. |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
PDF::Create parameters are described in the PDF::Create pod. |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
Setup |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
$pdf->setlabel(n) |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
n is a number from 0 to maxlabels. Subsequent calls to create |
121
|
|
|
|
|
|
|
labels will create labels starting from this position on the |
122
|
|
|
|
|
|
|
page. Position 0 is the upper left label, working across each |
123
|
|
|
|
|
|
|
row down in columns. |
124
|
|
|
|
|
|
|
|
125
|
|
|
|
|
|
|
i.e. 0 1 2 |
126
|
|
|
|
|
|
|
3 4 5 |
127
|
|
|
|
|
|
|
6 7 8 |
128
|
|
|
|
|
|
|
... |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
Setlabel will not go backwards. If n is less than the current |
131
|
|
|
|
|
|
|
cursor position, a new page will be created. |
132
|
|
|
|
|
|
|
|
133
|
|
|
|
|
|
|
Label Creation |
134
|
|
|
|
|
|
|
|
135
|
|
|
|
|
|
|
$pdf->label('string1', 'string2', 'string3'[, 'string4'...]) |
136
|
|
|
|
|
|
|
|
137
|
|
|
|
|
|
|
As much of each string as possible will be placed on a seperate |
138
|
|
|
|
|
|
|
line of the label. If there are more strings than the label can |
139
|
|
|
|
|
|
|
hold, extra strings will not be printed. |
140
|
|
|
|
|
|
|
|
141
|
|
|
|
|
|
|
@(#) Labels.pm Last updated 01/02/10 18:59:54 (SCCS Version 1.8) |
142
|
|
|
|
|
|
|
|
143
|
|
|
|
|
|
|
=head1 AUTHOR |
144
|
|
|
|
|
|
|
|
145
|
|
|
|
|
|
|
Owen DeLong, owen@delong.com |
146
|
|
|
|
|
|
|
|
147
|
|
|
|
|
|
|
=cut |
148
|
|
|
|
|
|
|
|
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
@PDF::Labels::PageFormats=( |
151
|
|
|
|
|
|
|
# pw:ph:xof:yof:x:yl:lwid:lh:lxma:lymar:fs:ls # Page quan labelsize |
152
|
|
|
|
|
|
|
# Sheet labels (laser or inkjet) |
153
|
|
|
|
|
|
|
"8.5:11:0.2:0.5:3:10:2.75:1:0.25:0.15:10:12", # 8.5x11 3x10 2.75x1" |
154
|
|
|
|
|
|
|
"8.5:11:0.2:0.5:2:10:4.25:1:0.25:0.15:10:12", # 8.5x11 2x10 4x1" |
155
|
|
|
|
|
|
|
"8.5:11:0.25:0.4:4:20:2.0625:0.5:0.25:0.1:6:7", # 8.5x11 4x20 1.75x0.5" |
156
|
|
|
|
|
|
|
# Pin feed labels (dot matrix) |
157
|
|
|
|
|
|
|
"4.25:5:0:0:1:5:3.5:1:0.25:0.135:12:14" # 4.25x5 1x5 3.5x.9375" |
158
|
|
|
|
|
|
|
); |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
@PDF::Labels::FriendlyNames=( |
161
|
|
|
|
|
|
|
"8.5x11 3 columns, 10 rows, 2.65x1 inch labels", |
162
|
|
|
|
|
|
|
"8.5x11 2 columns, 10 rows, 4x1 inch labels", |
163
|
|
|
|
|
|
|
"8.5x11 4 columns, 20 rows, 2x1/2 inch labels", |
164
|
|
|
|
|
|
|
"Pin Feed 3.5x1 inch labels, single column, 5 per fanfold" |
165
|
|
|
|
|
|
|
); |
166
|
|
|
|
|
|
|
|
167
|
|
|
|
|
|
|
# creation routine |
168
|
|
|
|
|
|
|
sub new { |
169
|
|
|
|
|
|
|
my $this = shift; |
170
|
|
|
|
|
|
|
my $PageFormat = shift; |
171
|
|
|
|
|
|
|
my %params = @_; |
172
|
|
|
|
|
|
|
|
173
|
|
|
|
|
|
|
my $class = ref($this) || $this; |
174
|
|
|
|
|
|
|
my $self = {}; |
175
|
|
|
|
|
|
|
bless $self, $class; |
176
|
|
|
|
|
|
|
$self->{'data'}=''; |
177
|
|
|
|
|
|
|
$self->{'PageFormat'}=$PageFormat; |
178
|
|
|
|
|
|
|
my ($pw, $ph, $xof, $yof, $xl, $yl, $lw, $lh, $lxm, $lym, $fp, $ls)= |
179
|
|
|
|
|
|
|
split(/:/, $PageFormat); |
180
|
|
|
|
|
|
|
$self->{'PageWidth'}=$pw; |
181
|
|
|
|
|
|
|
$self->{'PageHeight'}=$ph; |
182
|
|
|
|
|
|
|
$self->{'Xoffset'}=$xof; |
183
|
|
|
|
|
|
|
$self->{'Yoffset'}=$yof; |
184
|
|
|
|
|
|
|
$self->{'Xlabels'}=$xl; |
185
|
|
|
|
|
|
|
$self->{'Ylabels'}=$yl; |
186
|
|
|
|
|
|
|
$self->{'LabelWidth'}=$lw; |
187
|
|
|
|
|
|
|
$self->{'LabelHeight'}=$lh; |
188
|
|
|
|
|
|
|
$self->{'LabelXMargin'}=$lxm; |
189
|
|
|
|
|
|
|
$self->{'LabelYMargin'}=$lym; |
190
|
|
|
|
|
|
|
$self->{'FontSize'}=$fp; |
191
|
|
|
|
|
|
|
$self->{'LineSpacing'}=$ls; |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
$self->{'PDF'}=new PDF::Create(%params) || die('Couldn\'t create PDF'); |
194
|
|
|
|
|
|
|
if (!defined($self->{'PDF'}->{'fh'})) |
195
|
|
|
|
|
|
|
{ |
196
|
|
|
|
|
|
|
print "ERROR NO FH!\n"; |
197
|
|
|
|
|
|
|
} |
198
|
|
|
|
|
|
|
|
199
|
|
|
|
|
|
|
$self->{'rootpage'}=$self->{'PDF'}->new_page( |
200
|
|
|
|
|
|
|
'MediaBox' => [0,0,$self->{'PageWidth'}*72, |
201
|
|
|
|
|
|
|
$self->{'PageHeight'}*72], |
202
|
|
|
|
|
|
|
); |
203
|
|
|
|
|
|
|
|
204
|
|
|
|
|
|
|
$self->{'NormalFont'}=$self->{'PDF'}->font( |
205
|
|
|
|
|
|
|
'Basefont' => 'Helvetica' |
206
|
|
|
|
|
|
|
); |
207
|
|
|
|
|
|
|
|
208
|
|
|
|
|
|
|
$self->{'BoldFont'}=$self->{'PDF'}->font( |
209
|
|
|
|
|
|
|
'Basefont' => 'Helvetica-Bold' |
210
|
|
|
|
|
|
|
); |
211
|
|
|
|
|
|
|
|
212
|
|
|
|
|
|
|
|
213
|
|
|
|
|
|
|
$self->{'Pages'}=[]; |
214
|
|
|
|
|
|
|
|
215
|
|
|
|
|
|
|
push(@{$self->{'Pages'}}, $self->{'rootpage'}->new_page()); |
216
|
|
|
|
|
|
|
|
217
|
|
|
|
|
|
|
$self->{'CurrentLabel'}=0; |
218
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
return($self); |
220
|
|
|
|
|
|
|
} |
221
|
|
|
|
|
|
|
|
222
|
|
|
|
|
|
|
sub close { |
223
|
|
|
|
|
|
|
my $self = shift; |
224
|
|
|
|
|
|
|
my %params = @_; |
225
|
|
|
|
|
|
|
|
226
|
|
|
|
|
|
|
$self->{'PDF'}->close(); |
227
|
|
|
|
|
|
|
} |
228
|
|
|
|
|
|
|
|
229
|
|
|
|
|
|
|
sub setlabel { |
230
|
|
|
|
|
|
|
my $self = shift; |
231
|
|
|
|
|
|
|
my $lnum = shift; |
232
|
|
|
|
|
|
|
|
233
|
|
|
|
|
|
|
my $maxlabel = ($self->{'Xlabels'} * $self->{'Ylabels'}) - 1; |
234
|
|
|
|
|
|
|
if ($lnum > $maxlabel) |
235
|
|
|
|
|
|
|
{ |
236
|
|
|
|
|
|
|
return(-1); |
237
|
|
|
|
|
|
|
} |
238
|
|
|
|
|
|
|
if ($lnum < $self->{'CurrentLabel'}) |
239
|
|
|
|
|
|
|
{ |
240
|
|
|
|
|
|
|
print "$lnum Requires new page ($self->{'CurrentLabel'})\n"; |
241
|
|
|
|
|
|
|
$self->newpage(); |
242
|
|
|
|
|
|
|
} |
243
|
|
|
|
|
|
|
$self->{'CurrentLabel'}=$lnum; |
244
|
|
|
|
|
|
|
return($lnum); |
245
|
|
|
|
|
|
|
} |
246
|
|
|
|
|
|
|
|
247
|
|
|
|
|
|
|
sub label { |
248
|
|
|
|
|
|
|
my $self = shift; |
249
|
|
|
|
|
|
|
|
250
|
|
|
|
|
|
|
my $lnum = $self->{'CurrentLabel'}; |
251
|
|
|
|
|
|
|
my $y = int($lnum/$self->{'Xlabels'}); |
252
|
|
|
|
|
|
|
my $x = $lnum%$self->{'Xlabels'}; |
253
|
|
|
|
|
|
|
|
254
|
|
|
|
|
|
|
my $fn=$self->{'NormalFont'}; |
255
|
|
|
|
|
|
|
my $fb=$self->{'BoldFont'}; |
256
|
|
|
|
|
|
|
|
257
|
|
|
|
|
|
|
my $fs=$self->{'FontSize'}; |
258
|
|
|
|
|
|
|
my $ls=$self->{'LineSpacing'}; |
259
|
|
|
|
|
|
|
|
260
|
|
|
|
|
|
|
my $lw=($self->{'LabelWidth'}-$self->{'LabelXMargin'}*2) *72; |
261
|
|
|
|
|
|
|
my $lh=($self->{'LabelHeight'}-$self->{'LabelYMargin'}) *72; |
262
|
|
|
|
|
|
|
my $linecount=int($lh-($self->{'LabelYMargin'}*72))/$ls; |
263
|
|
|
|
|
|
|
|
264
|
|
|
|
|
|
|
my $X=($x*$self->{'LabelWidth'}+$self->{'LabelXMargin'}+ |
265
|
|
|
|
|
|
|
$self->{'Xoffset'})*72; |
266
|
|
|
|
|
|
|
my $Y=(($self->{'Ylabels'}-$y-1)*$self->{'LabelHeight'}+ |
267
|
|
|
|
|
|
|
$self->{'LabelYMargin'}+$self->{'Yoffset'})*72; |
268
|
|
|
|
|
|
|
|
269
|
|
|
|
|
|
|
my $q; |
270
|
|
|
|
|
|
|
|
271
|
|
|
|
|
|
|
$q=0; |
272
|
|
|
|
|
|
|
foreach(@_) |
273
|
|
|
|
|
|
|
{ |
274
|
|
|
|
|
|
|
$q++; |
275
|
|
|
|
|
|
|
next unless $linecount; # Skip lines beyond bottom of label. |
276
|
|
|
|
|
|
|
# Should add code here to check width of test |
277
|
|
|
|
|
|
|
${$self->{'Pages'}}[scalar(@{$self->{'Pages'}})-1]->string( |
278
|
|
|
|
|
|
|
$fn, $fs, $X, $Y+$linecount*$ls, $_); |
279
|
|
|
|
|
|
|
$linecount--; |
280
|
|
|
|
|
|
|
} |
281
|
|
|
|
|
|
|
# ${$self->{'Pages'}}[scalar(@{$self->{'Pages'}})-1]->newpath(); |
282
|
|
|
|
|
|
|
# ${$self->{'Pages'}}[scalar(@{$self->{'Pages'}})-1]->rectangle( |
283
|
|
|
|
|
|
|
# $X, $Y, $lw, $lh); |
284
|
|
|
|
|
|
|
# ${$self->{'Pages'}}[scalar(@{$self->{'Pages'}})-1]->stroke(); |
285
|
|
|
|
|
|
|
|
286
|
|
|
|
|
|
|
$self->{'CurrentLabel'}++; |
287
|
|
|
|
|
|
|
if ($self->{'CurrentLabel'} >= $self->{'Xlabels'}*$self->{'Ylabels'}) |
288
|
|
|
|
|
|
|
{ |
289
|
|
|
|
|
|
|
$self->newpage(); |
290
|
|
|
|
|
|
|
$self->{'CurrentLabel'}=0; |
291
|
|
|
|
|
|
|
} |
292
|
|
|
|
|
|
|
return(1); |
293
|
|
|
|
|
|
|
} |
294
|
|
|
|
|
|
|
|
295
|
|
|
|
|
|
|
sub newpage() |
296
|
|
|
|
|
|
|
{ |
297
|
|
|
|
|
|
|
my $self = shift; |
298
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
push(@{$self->{'Pages'}}, $self->{'rootpage'}->new_page()); |
300
|
|
|
|
|
|
|
return(1); |
301
|
|
|
|
|
|
|
} |
302
|
|
|
|
|
|
|
|