#!/usr/bin/perl use Cairo; use Gtk2 '-init'; use Glib qw(TRUE FALSE); use Poppler; my $path = 'file:///home/zentara/perlplay/Gtk2/cairo/z.pdf'; my $o = Poppler::Document->new_from_file($path); # or if you want to open the pdf in perl, or use some othe source: # open (PDF, "new_from_data($data, length($data)); my $page = $o->get_page( 0 ); my $dimension = $page->get_size; warn $dimension->get_width; warn $dimension->get_height; my ( $width, $height ) = ( $dimension->get_width, $dimension->get_height ); my $window = Gtk2::Window->new( 'toplevel' ); $window->signal_connect( 'delete_event' => sub { Gtk2->main_quit; } ); my $surface = Cairo::ImageSurface->create ('argb32', $width, $height); my $cr = Cairo::Context->create ($surface); # make a background rectangle filled white so screenshot is legible $cr->rectangle( 0, 0, $width, $height ); $cr->set_source_rgb( 1, 1, 1 ); #white $cr->fill; $page->render_to_cairo( $cr ); $cr->show_page; # make a visible widget to display the CairoSurface my $drawable = Gtk2::DrawingArea->new; $drawable->size( $width, $height ); $drawable->signal_connect( 'expose_event' => \&on_expose_event, $surface ); $window->add( $drawable ); $window->show_all; # take a screenshot $surface->write_to_png ("$0.png"); Gtk2->main; sub on_expose_event { my ( $widget, $event, $surface ) = @_; my $cr = Gtk2::Gdk::Cairo::Context->create( $widget->window ); $cr->set_source_surface( $surface, 0, 0 ); $cr->paint; $cr->show_page; return FALSE; } __END__