#!/usr/bin/perl -w
# Envelope
# Version 1.0.0
# Gregory Spath, gspath@homeip.net
# http://freefall.homeip.net
# Revision History
# 1.0.0 - Final planned release. A couple fixes, barcode
# placement changed to bottom right of envelope.
# 0.62 - Hack to add Delivery Point to barcode, $fromfile
# config option, see changelog for other changes
# 0.60 - POSTNET A & C field support
# 0.53 - Added [optionfile] section
# 0.52 - Added shipping label option
# 0.51 - Added per envelope options
# 0.50 - Initial Release
$filenum = 0;
# $files = $#ARGV + 1;
# Load default envelope config
defaults();
calc();
# Ok, now we are ready to make the envelopes
foreach $file (@ARGV){
$filenum++;
open (ADDRESS, "$file") or die "Could not open $file.\n";
@mailto = ();
@mailfrom = ();
@options = ();
$state = 'to';
$optionfile = "";
$dpc = "";
while (
){
chomp;
if ($_ eq '[options]') { $state = 'options'; next;}
if ($_ eq '[to]') { $state = 'to'; next;}
if ($_ eq '[from]') { $state = 'from'; $fromfile=""; next; }
if ($_ eq '[optionfile]') { $state = 'optionfile'; next; }
if ($_ =~ /^\[dp (\d{2})\]$/){ $state = 'dpc'; $dpc = $1; next; }
next if ($_ eq ""); #ignore blank lines
SWITCH: {
if ($state eq 'optionfile') {$optionfile = $_; $state = ''; last SWITCH;}
if ($state eq 'options') { push @options, $_; last SWITCH;}
if ($state eq 'to') { push @mailto, $_; last SWITCH;}
if ($state eq 'from') { push @mailfrom, $_; last SWITCH;}
}
}
close ADDRESS;
# Load options from file if specified
if ($optionfile){
open (OPTIONFILE, "<$optionfile") or die "Cannot open specified option file: $optionfile\n";
while ($option = ){
chomp $option;
eval $option;
}
close (OPTIONFILE);
calc();
}
# Load return address from file if specified
if ($fromfile){
open (FROMFILE, "<$fromfile") or die "Cannot open specified return address file: $fromfile\n";
while ($line = ){
chomp $line;
push @mailfrom, $line;
}
}
close (FROMFILE);
# Set per envelope options
foreach $option (@options){
eval $option;
calc();
}
# Got all the data...now start printing
print "%!\n";
print "% Greg's envelope printer\n";
print "newpath\n";
if ($shiplabel){
$i = int($x0 + $leftmargin * 72);
$j = int($y0 - $topmargin * 72);
} else {
$i = int($x0 + $topmargin * 72);
$j = int($y0 + $leftmargin * 72);
}
# Set our coordinate system
print "$i $j translate\n";
print "90 rotate\n" unless ($shiplabel);
# Print the Return Address
$linepos = 0;
$whichline=0;
foreach $line (@mailfrom){
$whichline++;
if ($whichline == 1 && $line !~ /^<(\S+)\s+(\d+)>$/){
print "/$return1font findfont $return1pointsize scalefont setfont\n";
$pointsize = $return1pointsize;
}
if ($whichline == 2 && $line !~ /^<(\S+)\s+(\d+)>$/){
print "/$returnxfont findfont $returnxpointsize scalefont setfont\n";
$pointsize = $returnxpointsize;
}
if ($line =~ /^\s*<(\S+)\s+(\d+)>$/){
$font = $1;
$pointsize = $2;
print "/$font findfont $pointsize scalefont setfont\n";
$whichline++;
next;
}
print "0 $linepos moveto\n";
print "($line) show\n";
$linepos = $linepos - $pointsize;
}
if ($shiplabel){
$xpos = 0;
$ypos = $linepos - $pointsize * 2;
} else {
$xpos = int(0.40*72*$ewidth);
$ypos = int(-0.40*72*$eheight);
}
# Print the Mailing Address
$whichline=0;
$fullzip='';
foreach $line (@mailto){
$whichline++;
if ($whichline == 1 && $line !~ /^<(\S+)\s+(\d+)>$/){
print "/$line1font findfont $line1pointsize scalefont setfont\n";
$pointsize = $line1pointsize;
}
if ($whichline == 2 && $line !~ /^<(\S+)\s+(\d+)>$/){
print "/$linexfont findfont $linexpointsize scalefont setfont\n";
$pointsize = $linexpointsize;
}
if ($line =~ /^<(\S+)\s+(\d+)>$/){
$font = $1;
$pointsize = $2;
print "/$font findfont $pointsize scalefont setfont\n";
$whichline++;
next;
}
if ($line =~ /^(\d{5}) (.*)/){
$fullzip = $1 if $1;
$line = $2 if $2;
}
if ($fullzip) {
$ypos = $ypos - ((5-$whichline)*(5-$whichline>0)*$pointsize);
$line = substr($fullzip ,0,1)." ".substr($fullzip ,1,1)." ".substr($fullzip ,2,1)." ".substr($fullzip ,3,1)." ".substr($fullzip ,4,1)." ".$line ;
}
print "$xpos $ypos moveto\n";
print "($line) show\n";
$ypos = $ypos - $pointsize;
}
# Print the barcode
if (length $fullzip == 5){
$fullzip .= $dpc;
} elsif ($dpc){
print STDERR "Delivery point codes for non ZIP+4 codes don't make sense.\n";
print STDERR "Ignoring Delivery Point code.\n";
}
if ($shiplabel || $bcaddressblock){
$ypos = $ypos - 0.125 * 72;
} else {
$xpos = int(($ewidth-3.875)*72);
$ypos = int((-1.0 * $eheight + 0.375)*72);
}
barcode($fullzip, $xpos, $ypos) if ($fullzip && $barcode);
print "showpage\n";
# if ($prompt && $filenum != $files){
# print STDERR "Done with $filenum / $files\n";
# print STDERR "Bang a key to print the next Envelope when ready";
# $hitme = ;
# print STDERR "\n";
# } else {
# print "** Done **\n" if ($filenum == $files);
# }
# Reset the values from the rc file, in case we have switched them for this
# envelope
defaults();
calc();
}
sub calc {
if ($shiplabel){
$x0 = 0.25 * 72;
$y0 = ($normalpaper) * 72;
} else {
$x0 = 0; #envelope X origin
$y0 = ($normalpaper - $ewidth) * 72; #envelope Y origin
}
($line1font, $line1pointsize) = split(" ", $line1);
($linexfont, $linexpointsize) = split(" ", $linex);
($return1font, $return1pointsize) = split(" ", $return1);
($returnxfont, $returnxpointsize) = split(" ", $returnx);
}
sub defaults {
$line1 = "Times-Roman-Bold 12";
$linex = "Times-Roman 12";
$return1 = "Times-Roman-Bold 10";
$returnx = "Times-Roman 10";
$ewidth = 9.5;
$eheight = 4.125;
$normalpaper = 11;
$leftmargin = 0.25;
$topmargin = 0.30;
$barcode = 1;
$bcaddressblock = 0;
$rcfile = "$ENV{HOME}/.enveloperc";
$shiplabel = 0;
$fromfile = "";
$noconfig = 0;
# $hitme = "";
# $prompt = 1;
# load rc file
$rc = open(CONFIG, "<$rcfile");
if (!$rc){
$noconfig = 1;
print STDERR "Could not open $rcfile, using default envelope values.\n";
} else {
while ($command = ){
chomp $command;
$command =~ tr/"/'/; # accidental re-assign protection
eval $command;
}
close (CONFIG);
}
}
sub barcode{
my @code = (
[1, 1, 0, 0, 0], # 0
[0, 0, 0, 1, 1], # 1
[0, 0, 1, 0, 1], # 2
[0, 0, 1, 1, 0], # 3
[0, 1, 0, 0, 1], # 4
[0, 1, 0, 1, 0], # 5
[0, 1, 1, 0, 0], # 6
[1, 0, 0, 0, 1], # 7
[1, 0, 0, 1, 0], # 8
[1, 0, 1, 0, 0], # 9
);
my $zipcode = shift;
my $xpos = shift;
my $ypos = shift;
my @ziparray = ();
my $zipsum = 0;
for ($i = 0; $i