diff --git a/Changes b/Changes index 0c015b2..650244c 100644 --- Changes +++ Changes @@ -1,5 +1,11 @@ Revision history for Perl extension Poppler. +1.0102 Sun Apr 10 13:21:00 2016 + - Fixed new_from_data() constructor + +1.0101 Sun Jan 10 23:03:01 2016 + - Fixed minimum URI version and repository URL in Build.PL + 1.01 Sun Jan 03 14:13:00 2016 - major re-write to utilize GObject introspection diff --git a/lib/Poppler.pm b/lib/Poppler.pm index 842a123..7abc6bc 100644 --- lib/Poppler.pm +++ lib/Poppler.pm @@ -1,6 +1,6 @@ package Poppler; -our $VERSION = "1.0101"; +our $VERSION = "1.0102"; $VERSION = eval $VERSION; =encoding utf8 @@ -13,40 +13,42 @@ Poppler - Bindings to the poppler PDF rendering library use Poppler; - # initialize using filename - my $pdf = Poppler::Document->new_from_file( 'file.pdf' ); + use strict; + use warnings; - # or, initialize using scalar data - open my $fh, '<:raw', 'file.pdf'; - read ($fh, my $data, -s 'file.pdf') - close $fh; - my $pdf = Poppler::Document->new_from_data( $data ); + # initialize using filename + my $pdf = Poppler::Document->new_from_file( $ARGV[0] ); # get some general info - my $n_pages = $pdf->get_n_pages; - my $title = $pdf->get_title; + print "Pages : ", $pdf->get_n_pages, "\n"; + print "Title : ", $pdf->get_title, "\n"; # etc ... # get the first page - my $page = $pdf->get_page( 0 ); + my $page = $pdf->get_page(0); - # get page size - my ($w, $h) = $page->get_size; + # get page size the simple way + my ($w, $h) = $page->get_size; + print "Dims1 : $w x $h\n"; # or, for backward compatibility my $dims = $page->get_size; # a Poppler::Dimension object - my $w = $dims->get_width; - my $h = $dims->get_height; + $w = $dims->get_width; + $h = $dims->get_height; + print "Dims2 : $w x $h\n"; # do other fancy things (get page links, annotations, movies, etc) # (see poppler-glib documentation for details) # render to a Cairo surface - use Cairo; - my $surface = Cairo::ImageSurface->create( 'argb32', 100, 100 ); - my $cr = Cairo::Context->create( $surface ); - $page->render_to_cairo( $cr ); - $cr->show_page; + use Cairo::GObject; + my ($w_px, $h_px) = map {$_ * 96/72 } ($w,$h); # points to pixels + my $surface = Cairo::ImageSurface->create( 'argb32', $w_px, $h_px ); + my $context = Cairo::Context->create( $surface ); + $context->scale(96/72, 96/72); # points to pixels + $page->render( $context ); + $context->show_page; + $surface->write_to_png( $ARGV[1] ); =head1 ABSTRACT @@ -285,6 +287,42 @@ sub Poppler::Page::get_size { } +sub Poppler::Document::new_from_data { + + my ($class, $data, $len, $pwd) = @_; + + #----------------------------- + # this is how it should be done, but can't get it to work yet + #----------------------------- + + #$data = _unpack_unless_array_ref( $data ); + #$len = scalar(@$data); + + #return Glib::Object::Introspection->invoke ( + #$_POPPLER_BASENAME, 'Document', 'new_from_data', + #$class, $data, $len + #); + + #----------------------------- + # this is an ugly hack to make things work + #----------------------------- + + use File::Temp; + my $tmp = File::Temp->new( UNLINK => 1 ); + print {$tmp} $data; + close $tmp; + return Poppler::Document->new_from_file("$tmp", $pwd); + +} + +sub _unpack_unless_array_ref { + my ($data) = @_; + local $@; + return eval { @{$data} } + ? $data + : [unpack 'C*', $data]; +} + =back =cut diff --git a/t/poppler.t b/t/poppler.t index 2957681..bf2070d 100644 --- t/poppler.t +++ t/poppler.t @@ -14,7 +14,8 @@ require_ok ("Poppler"); my $fn1 = 'test.pdf'; -ok (my $pdf = Poppler::Document->new_from_file($fn1), "loaded new Document"); +ok (my $pdf = Poppler::Document->new_from_file($fn1), + "loaded new Document from filename"); ok ($pdf->get_author eq 'Jane Doe', "author matched"); ok ($pdf->get_creator eq 'John Doe', "creator matched"); ok ($pdf->get_producer eq 'some-program', "producer matched"); @@ -41,5 +42,13 @@ ok (my $p2 = $pdf->get_page(1), "fetched second page"); ok (! $p2->find_text('BAR'), "no match second page"); ok ($p2->find_text('BAZ'), "yes match second page"); +# test new_from_data() +my $size = -s $fn1; +open my $in, '<:raw', $fn1 or die "Error opening test file for reading: $@"; +my $r = read($in, my $data, $size) or die "Error reading raw data: $@"; +ok ($pdf = Poppler::Document->new_from_data($data), + "loaded new Document from data"); +ok ($pdf->get_author eq 'Jane Doe', "author matched"); + done_testing(); exit;