# # An example program which creates graph paper. Very simple, but shows the basics # page creation, etc. use Text::PDF::File; use Text::PDF::Page; use Text::PDF::Utils; use IO::File; use Getopt::Std; getopts('c:m:n:p:s:'); unless(defined $ARGV[0] && $opt_c) { die <<'EOT'; GRAPH [-M left,bottom,right,top] [-n num] [-p num] [-s size] -c config.dat outfile Generates graph paper as a PDF file to outfile. -c data file Configuration file -M num,num,num,num Margins in points [56,56,56,56] -n num Number of line blocks to fit or 0 for no flexibility -p num Only generate page number num -s size either one of (A4,ltr,lgl,A3,A5) or width,height Config file: \width pts Height in points of one line block \line pts [string] relative to bottom of block, PDF string (optional) \line ... EOT } %sizes = ( 'a3' => [840, 1190], 'a4' => [595, 840], 'a5' => [420, 595], 'ltr' => [612, 792], 'lgl' => [792, 1008], 'a3l' => [1190, 840], 'a4l' => [840, 595], 'a5l' => [595, 420], 'ltrl' => [792, 612], 'lgll' => [1008, 792] ); $opt_m = "56,56,56,56" unless $opt_m; $opt_s = 'A4' unless $opt_s; process($opt_c) || die "Can't process $opt_c"; if (defined $sizes{lc($opt_s)}) { @opt_s = @{$sizes{lc($opt_s)}}; } else { @opt_s = split(/,\s*/, $opt_s); } @opt_m = split(/,\s*/, $opt_m); $pdf = Text::PDF::File->new; $root = Text::PDF::Pages->new($pdf); $root->proc_set("PDF"); $root->bbox(0, 0, @opt_s); # Now pretend to make a simple font: # $font = Text::PDF::SFont->new($pdf, 'Helvetica', 'F0'); # $root->add_font($font); # Use same principle for other fonts. Could use $page->add_font($font) just as well. # OK Now put something on this exciting page! $height = $opt_s[1] - $opt_m[1] - $opt_m[3]; $farr = $opt_s[0] - $opt_m[2]; if (defined $opt_p) { $first = $opt_p; $last = $opt_p; } else { $first = 0; $last = scalar @widths; } for ($pcount = $first; $pcount < $last; $pcount++) { $page = Text::PDF::Page->new($pdf, $root); $width = $widths[$pcount]; if ($opt_n eq '0') { $gap = 0; } else { $opt_n = int($height / $width) unless $opt_n; $gap = ($height - $opt_n * $width) / ($opt_n - 1); } for ($y = $opt_m[1]; $y <= $height + $opt_m[3]; $y += $width + $gap) { foreach $l (@{$lines[$pcount]}) { $offy = $l->[0] + $y; $page->add(sprintf("%s %d %.2f m %d %.2f l S\n", $l->[1], $opt_m[0], $offy, $farr, $offy)); } } # $page->{' curstrm'}{'Filter'} = PDFArray(PDFName('FlateDecode')); } # Only now that something has been added can we mess with the content stream $pdf->out_file($ARGV[0]); sub process { my ($fname) = @_; my ($fh) = IO::File->new("< $fname") || return undef; my ($width, $pcount); $pcount = -1; while (<$fh>) { if (m/^\\width\s+([0-9.]+)/o) { $pcount++; $widths[$pcount] = $1; } elsif (m/^\\line\s+([0-9.]+)(?:\s+(.*?)\s*$)?/o) { my ($pos) = $1; my ($str) = $2 || '[] 0 d .25 w 0 g'; push (@{$lines[$pcount]}, [$pos, $str]); } } 1; }