PDF-Make

 view release on metacpan or  search on metacpan

lib/PDF/Make/Linearization.pm  view on Meta::CPAN

        *PDF::Make::Document::is_linearized = sub { $_[0]->_xs_is_linearized };
    }

    # linear_params - wraps XS _xs_linear_params; returns undef when not linearized
    unless (defined &PDF::Make::Document::linear_params) {
        *PDF::Make::Document::linear_params = sub {
            my ($self) = @_;
            return undef unless $self->is_linearized;
            return $self->_xs_linear_params;
        };
    }

    # linearize - wraps XS _xs_linearize, records state for write_linearized
    unless (defined &PDF::Make::Document::linearize) {
        *PDF::Make::Document::linearize = sub {
            my ($self) = @_;
            $self->_xs_linearize;
            $_linearize_state{"$self"} = 1;
            return $self;
        };
    }

    # write_linearized - wraps XS _xs_write_linearized_to_path, or returns bytes
    unless (defined &PDF::Make::Document::write_linearized) {
        *PDF::Make::Document::write_linearized = sub {
            my ($self, $path) = @_;
            $_linearize_state{"$self"} = 1;
            return $self->_xs_write_linearized_to_path($path) if defined $path;
            return $self->_write_linearized_bytes;
        };
    }
    
    # _write_linearized_bytes - use LinearContext to produce linearized output
    unless (defined &PDF::Make::Document::_write_linearized_bytes) {
        *PDF::Make::Document::_write_linearized_bytes = sub {
            my ($self) = @_;

            # Use LinearContext pipeline
            my $ctx = PDF::Make::LinearContext->_new($self);
            $ctx->analyze;
            $ctx->build_hints;
            return $ctx->write;
        };
    }
}

=head1 PDF::Make::StreamReader

Streaming reader for linearized PDFs, enabling page-on-demand loading.

=head2 new

    my $reader = PDF::Make::StreamReader->new(
        fetch => sub {
            my ($offset, $length) = @_;
            # Return $length bytes starting at $offset
            return $data;
        }
    );

Creates a new streaming reader with the given fetch callback.

=head2 read_header

    $reader->read_header;

Reads and parses the PDF header and linearization dictionary.
This is the first operation to perform.

=head2 is_linearized

    if ($reader->is_linearized) { ... }

Returns true if the PDF is linearized.

=head2 page_count

    my $count = $reader->page_count;

Returns the total number of pages. Available after C<read_header>.

=head2 page_available

    if ($reader->page_available($page_num)) { ... }

Returns true if the given page (0-based) is loaded.

=head2 read_page

    $reader->read_page($page_num);

Fetches and parses the given page's data. May trigger HTTP range request.

=head2 page_range

    my ($offset, $length) = $reader->page_range($page_num);

Returns the byte offset and length for the given page.
Useful for HTTP Range header construction.

=cut

package PDF::Make::StreamReader;

use strict;
use warnings;
use Carp qw(croak);

sub new {
    my ($class, %args) = @_;
    
    croak "fetch callback required" unless $args{fetch};
    croak "fetch must be a code reference" unless ref($args{fetch}) eq 'CODE';
    
    my $self = bless {
        fetch           => $args{fetch},
        is_linearized   => 0,
        page_count      => 0,
        params          => {},
        hints_loaded    => 0,
        page_hints      => [],



( run in 0.596 second using v1.01-cache-2.11-cpan-6aa56a78535 )