Poppler

 view release on metacpan or  search on metacpan

lib/Poppler.pm  view on Meta::CPAN


our $VERSION = "1.0103";
$VERSION = eval $VERSION;

=encoding utf8

=head1 NAME

Poppler - Bindings to the poppler PDF rendering library

=head1 SYNOPSIS

  use Poppler;

  use strict;
  use warnings;

  # initialize using filename 
  my $pdf = Poppler::Document->new_from_file( $ARGV[0] );

  # get some general info
  print "Pages : ", $pdf->get_n_pages, "\n";
  print "Title : ", $pdf->get_title,   "\n";
  # etc ...

  # get the first page
  my $page = $pdf->get_page(0);

  # 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
  $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::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

Bindings to the poppler PDF library via the Glib interface. Allows
querying of a PDF file structure and rendering to various output targets.

=head1 DESCRIPTION

The C<Poppler> module provides complete bindings to the poppler PDF library
through the Glib interface. Find out more about poppler at
L<http://poppler.freedesktop.org>.

As of version 1.01, no XS is used directly but bindings are provided using
GObject introspection and the L<Glib::Object::Introspection> module. See the
L<Poppler/SYNOPSIS> for a brief example of how the module can be used. For
detailed documentation on the available classes and methods, see the poppler
glib documentation for the C libraries and the L<Glib::Object::Introspection>
documentation for a description of how methods are mapped between the C
libraries and the Perl namespace.

=head1 CONSTRUCTORS

=over

=item new_from_file ($filename)

Takes a system path or URI to a PDF file as an argument and returns a
Poppler::Document object. The C<poppler-glib> library itself requires a full
URI (e.g. "file:///home/user/file.pdf") but this module attempts to convert
regular system paths if provided via the L<URI> module.

=item new_from_data ($data)

Takes a PDF data chunk as an argument and returns a Poppler::Document object.

=back

=head1 METHODS

For details on the classes and methods available beyond the constructors
listed above, please refer to the canonical documentation for the C library
listed under L<Poppler/SEE ALSO>. A general discussion of how these classes
and methods map to the Perl equivalents can be found in the
L<Glib::Object::Introspection> documentation. Generally speaking, a C function
such as 'poppler_document_get_title' would map to
'Poppler::Document->get_title'.

=cut

use strict;
use warnings;
use Carp qw/croak/;
use Cwd qw/abs_path/;
use Exporter;
use File::ShareDir;
use Glib::Object::Introspection;
use URI::file;
use FindBin;
use Poppler::Page::Dimension;

our @ISA = qw(Exporter);

my $_POPPLER_BASENAME = 'Poppler';
my $_POPPLER_VERSION  = '0.18';
my $_POPPLER_PACKAGE  = 'Poppler';

=head2 Customizations and overrides

In order to make things more Perlish, C<Poppler> customizes the API generated
by L<Glib::Object::Introspection> in a few spots:

lib/Poppler.pm  view on Meta::CPAN

    my ($class) = @_;

    my ($w,$h) = Glib::Object::Introspection->invoke(
        'Poppler', 'Page', 'get_size', $class);
    return Poppler::Page::Dimension->new($w, $h)
        if (! wantarray);
    return($w, $h);

}

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

1;

__END__


=head1 SEE ALSO

=over

=item * C library documentation for poppler-glib at
L<http://people.freedesktop.org/~ajohnson/docs/poppler-glib/>.

=item * L<Glib>

=item * L<Glib::Object::Introspection>

=back

=head1 AUTHORS

=over

=item 2009-2016 Cornelius , < cornelius.howl _at_ gmail.com >

=item 2016-present Jeremy Volkening <jdv@base2bio.com>

=back

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2009-2016 by c9s (Cornelius)
Copyright (C) 2016 by Jeremy Volkening

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.10.0 or,
at your option, any later version of Perl 5 you may have available.

=cut



( run in 2.319 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )