#!/usr/bin/perl use Net::vCard; use PDF::API2; use strict; # Scaling factor 72 pts/inch our $scale=72; # Avery 8660 - measurements are in inches our %page=( size => "LETTER", height => 8.5, width => 8.5, offsetX => 0, offsetY => -0.25, rows => 10, cols => 3, marginLeft => 0.25, marginRight => 0.25, marginTop => 0.5, marginBottom => 0.5, colSpace => 0.25, rowSpace => 0, padX => 0.25, padY => 0.1, ); sub labelWidth { return ( $page{width} - $page{marginLeft} - $page{marginRight} - $page{colSpace} * ($page{cols} - 1) ) / $page{cols} * $scale; } sub labelHeight { return ( $page{height} - $page{marginTop} - $page{marginBottom} - $page{rowSpace} * ($page{rows} - 1) ) / $page{rows} * $scale; } # Compute label's starting X position sub labelX { my $col=shift; $col--; return $page{marginLeft} * $scale + ( (labelWidth() + $page{colSpace} * $scale) * $col + $page{offsetX} * $scale); } # Compute label's starting Y position sub labelY { my $row=shift; return $page{marginTop} * $scale + $row * labelHeight() + $page{offsetY} * $scale; } # Draw a label at this position sub labelAt { my $page=shift; my $pdf =shift; my $font=shift; my $row=shift; my $col=shift; return if $row > $page{rows}; return if $col > $page{cols}; my $pad = $page{padding} * $scale; my $text=$page->text; $text->translate( labelX($col) + $page{padX} * $scale, labelY($row) - $page{padY} * $scale ); # NAME $text->font( $font->{'bold'}, 10); $text->text( shift ); $text->font( $font->{'plain'}, 10); while ( @_ ) { $text->cr( -12 ); $text->text( shift ); } } use PDF::API2; my $pdf=PDF::API2->new; my %font; $font{'plain'} = $pdf->corefont('Helvetica', 1); $font{'bold'} = $pdf->corefont('Helvetica-Bold', 1); my $cards=Net::vCard->loadFile(@ARGV); while (@$cards) { my $page=$pdf->page(); # $page->mediabox( $page{width} * $scale, $page{height} * $scale ); $page->mediabox( $page{size} ); for my $row (1 .. $page{rows}) { last unless @$cards; for my $col (1 .. $page{cols}) { last unless @$cards; my $card = shift @$cards; labelAt($page, $pdf, \%font, $row, $col, $card->FN, ( split /[\n\r]+/, $card->ADR->address ), $card->ADR->city . ", " . $card->ADR->region . " " . $card->ADR->country, $card->ADR->postalCode ); } } } open PDFOUT, ">export.pdf"; print PDFOUT $pdf->stringify; $pdf->end;