#!/usr/bin/perl -w use CAM::PDF; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); use PDF::API2; use Data::Dumper; use strict; our $VERSION = '0.02'; my %opts = ( infile => undef, pagenum => undef, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('i|infile=s' => \$opts{infile}, 'p|pagenum=s' => \$opts{pagenum}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "v$VERSION\n"; exit 0; } unless ($opts{infile} ){ print "Missing option -i (infile) \n"; die; } $opts{pagenum} ||= 1; # get contents of e.g. page #27 # parse strings: my $infile = $opts{infile}; my $campdf=CAM::PDF->new($infile) or die "Can't open infile: $!\n"; my $numpages = $campdf->numPages(); print "Document $infile has $numpages pages.\n"; #rangeToArray ($pkg_or_doc, $min, $max, @range_parts) = @_; my @range = CAM::PDF->rangeToArray(1, $numpages, "$opts{pagenum}"); my $range = join ", " , @range; print "Checking page(s) " . $range . ".\n"; ## done with campdf # for each string $s matching something:.../, # find coordinates of bounding box # add a link at that position, consisting of: http://my.org/$s my $pdfa2 = PDF::API2->open($infile); foreach my $pagenum (@range){ my ($x, $y); $x = 40; $y = 680; my $pdfpage = $pdfa2->openpage($pagenum); my $str = $pdfpage->text(); ## HERE I NEED TO parse all text strings on the page ## but I don't know how to do that ## continuing with hard-wired example... $pdfpage->gfx->textlabel( $x, $y, $pdfa2->corefont('Arial',-encode => 'latin1'), 10, "Link", ); my $url = qq{ http://my.org/something}; draw_url($pdfa2, $pagenum, [$x, $y, $x + 50, $y + 10], $url); $pdfpage->update(); print "page $pagenum\n"; } # save the page to a new file. $pdfa2->saveas("doc/new.pdf"); $pdfa2->end; sub draw_url { my ($pdf, $page_num, $dims, $url) = @_; my $page = $pdf->openpage($page_num); my $an = $page->annotation; $an->url($url, (-rect => $dims), (-border => [1, 1, 1])); $page->update; }