in reply to Add images to PDF using pdf::ap12

I am not sure if this would be of any help to you, but some time ago I wrote a module PDF::TableX which is built on top of PDF::API2 and simplifies generation of tabular pdfs. It can be relatively easy extended to work with images, see the code below:
#!/usr/bin/env perl -w # this extends the regular text cell with image capabilities package ImageContent; use Moose::Role; use PDF::API2; sub draw_content { my ($self, $x, $y, $gfx, $txt) = @_; $y -= ($self->padding->[0] + 200); $x += $self->padding->[3]; if ($y < $self->margin->[2]) { return (200, $self->height, 1); } else { my $image_object = $gfx->{' api'}->image_jpeg( $self->content +); $gfx->image($image_object, $x, $y, 200, 200); $self->height(200+$self->padding->[0]+$self->padding->[2]); return (200, $self->height, 0); } } sub _get_min_width { 200 + $_[0]->padding->[1] + $_[0]->padding->[3] } sub _get_reg_width { 200 + $_[0]->padding->[1] + $_[0]->padding->[3] } sub _get_height { 200 + $_[0]->padding->[0] + $_[0]->padding->[2] } # the actual script to build the page use Moose::Util qw( apply_all_roles does_role); use PDF::TableX; use PDF::API2; my $contents = [ ['http://something/something', 'img.jpg'], ['http://something/something', 'img1.jpg'], ['http://something/something', 'img2.jpg'], ['http://something/something', 'img3.jpg'], ]; my $table = PDF::TableX->new(2,4); my $pdf = PDF::API2->new(); $pdf->mediabox('a4'); my $page = $pdf->page; $table ->padding(0) ->border_width(0) ->text_align('center'); $table->[0]->border_width(0); foreach my $i (0..3) { foreach my $j (0..1) { if ($j == 1) { apply_all_roles( $table->[$i][$j], 'ImageConten +t'); } $table->[$i][$j]->content($contents->[$i][$j]); } } $table->draw($pdf, $page); $pdf->saveas('output.pdf');
or the documentation PDF::TableX

Replies are listed 'Best First'.
Re^2: Add images to PDF using pdf::ap12
by cristofayre (Sexton) on Feb 20, 2015 at 17:02 UTC
    Thanks for the time in posting your code, but that's a little "heavy" for me. I ended up using a couple of for ->next loops
    use PDF::API2; print "content-type: text/html\n\n"; use CGI::Carp qw( fatalsToBrowser ); $pdf = PDF::API2->new(-file => 'new.pdf'); # prepares filespace # 10 pages without above graphic = <3 seconds for ($doc=0; $doc<10; $doc++){ # Repeat for each new loop $page = $pdf->page(); # Adds new page to document. $page->mediabox('A4'); # Sets page size to A4 $font = $pdf->corefont('Verdana'); # Adds the Verdana font $text = $page->text(); # Adds some text to page $across=30; $up=48; $z=0; $qr=$pdf->image_png('test.png'); # Test pathname $arrow=$pdf->image_png('C:\...\arrows.png'); # Test pathname $gfx = $page->gfx; for ($x=0; $x<3; $x++){ # Across in 180dpi steps $new_across=$across+(180*$x); for ($y=0; $y<8; $y++){ # Up in 96dpi steps $new_up=$up+(96*$y); $text->font($font, 8); $text->translate($new_across, $new_up); $text->text('http://www.###/abcde/122345'); # Test URL $text->font($font, 9); $text->translate($new_across+11, $new_up+56); $text->text('Find Your'); $text->translate($new_across+16, $new_up+45); $text->text('Photos'); $text->font($font, 11); $text->translate($new_across+25, $new_up+34); $text->text('HERE'); $gfx->image($qr, ($new_across+90), ($new_up+10)); $gfx->image($arrow, ($new_across-4), ($new_up+12)); $z++; } } #$file=$pdf->image_png('C:\...label_layout.png'); # This is onl +y a test pathname #$gfx = $page->gfx; #$gfx->image($file, 0, 0); } # End of Page loop $pdf->save(); # Saves the file print "OK"; exit;
    I will now add some code from GD library to create 24 QR code images, and then load them into page 1 by 1. Then discard them, and prepare the next batch for next page and so on.

      So one more piece of code from myself. I wrote very small module that extends the PDF::API2 with QRCodes capabilities. Unfotunatelly although I sent this to current package maintener it never appeard in the PDF::API2

      Anyway you may have a look at https://github.com/grzegorzpapkala/PDF-API2-Resource-XObject-Form-QRCode. It relays on Text::QRCode. This way you can generate the QRcodes without extra GD calls. Maybe it would be easier this way.

        Sorry I've not replied before now. Been busy trying to get all the models to work! So I completed my code using GD before I saw this. I may give it a try, but to be honest, the AP12 and GD are creating 240 labels in 3 seconds, which I don't think is too bad. (Then again, 2400 is about 27 secs, so if your little code beats that ...)

        Alas, now run into another problem: I can't get the PDF to read into perl / appear in browser. (Fine if clicked/opened from local folder) I've submitted another post to the Monks, but basically the code is 212K ... but won't proceed beyond 4K whatever I try. And if I can't read it into memory again, I can't send it to browser / zip it or do anything!