From bc2157796968bf2d17db0663964f5d3bfa120ffc Mon Sep 17 00:00:00 2001 From: Jeffrey Ratcliffe Date: Tue, 30 Apr 2013 13:25:03 +0200 Subject: [PATCH] Allow thread to import different number of pages than requested --- History | 2 + MANIFEST | 1 + lib/Gscan2pdf/Document.pm | 31 +++++++++--- t/168_import_multipage_PDF.t | 4 +- t/169_import_multipage_PDF2.t | 112 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 t/169_import_multipage_PDF2.t diff --git a/History b/History index 0843d0b..34f9c3d 100644 --- a/History +++ b/History @@ -3,6 +3,8 @@ * Don't lose extension if user-defined tool converts pnm to pbm, ppm or pgm. Closes Launchpad bug 889549 (again) (gscan2pdf gimp integration creates page size error) +* Allow thread to import different number of pages than requested. + Closes LP: #1163739 (Import of pdf no longer working) 1.1.3 (25.02.2013): diff --git a/MANIFEST b/MANIFEST index acf2a70..7aede08 100644 --- a/MANIFEST +++ b/MANIFEST @@ -168,6 +168,7 @@ t/165_import_with_spaces.t t/166_cancel_import.t t/167_import_with_error.t t/168_import_multipage_PDF.t +t/169_import_multipage_PDF2.t t/171_save_session.t t/172_open_session.t t/173_open_crashed_session.t diff --git a/lib/Gscan2pdf/Document.pm b/lib/Gscan2pdf/Document.pm index 381ada7..374862c 100644 --- a/lib/Gscan2pdf/Document.pm +++ b/lib/Gscan2pdf/Document.pm @@ -57,6 +57,13 @@ my $jobs_completed = 0; my $jobs_total = 0; my ( $_self, $d, $logger, $paper_sizes ); +my %format = ( + 'pnm' => 'Portable anymap', + 'ppm' => 'Portable pixmap format (color)', + 'pgm' => 'Portable graymap format (gray scale)', + 'pbm' => 'Portable bitmap format (black and white)', +); + sub setup { ( my $class, $logger ) = @_; $_self = {}; @@ -181,14 +188,26 @@ sub fetch_file { if ($n) { while ( $i < $n ) { my $page = $_self->{page_queue}->dequeue; - $self->add_page( $page->thaw ); - ++$i; + if ( ref($page) eq '' ) { + $n = $page; + return $self->fetch_file($n); + } + else { + $self->add_page( $page->thaw ); + ++$i; + } } } else { while ( defined( my $page = $_self->{page_queue}->dequeue_nb() ) ) { - $self->add_page( $page->thaw ); - ++$i; + if ( ref($page) eq '' ) { + $n = $page; + return $self->fetch_file($n); + } + else { + $self->add_page( $page->thaw ); + ++$i; + } } } return $i; @@ -1586,13 +1605,13 @@ sub _thread_import_file { # Import each image my @images = glob('x-???.???'); - my $i = 0; + $self->{page_queue}->enqueue( $#images + 1 ); foreach (@images) { my $page = Gscan2pdf::Page->new( filename => $_, dir => $options{dir}, delete => TRUE, - format => $_, + format => $format{ substr( $_, length($_) - 3, 3 ) }, ); $self->{page_queue}->enqueue( $page->to_png($paper_sizes)->freeze ); } diff --git a/t/168_import_multipage_PDF.t b/t/168_import_multipage_PDF.t index 359ba86..a6d35a5 100644 --- a/t/168_import_multipage_PDF.t +++ b/t/168_import_multipage_PDF.t @@ -1,11 +1,11 @@ use warnings; use strict; -use File::Basename; # Split filename into dir, file, ext +use File::Temp; use Test::More tests => 1; BEGIN { use Gscan2pdf::Document; - use Gtk2 -init; # Could just call init separately + use Gtk2 -init; # Could just call init separately } ######################### diff --git a/t/169_import_multipage_PDF2.t b/t/169_import_multipage_PDF2.t new file mode 100644 index 0000000..23d3da2 --- /dev/null +++ b/t/169_import_multipage_PDF2.t @@ -0,0 +1,112 @@ +use warnings; +use strict; +use File::Temp; +use Test::More tests => 1; + +BEGIN { + use Gscan2pdf::Document; + use Gtk2 -init; # Could just call init separately +} + +######################### + +use Log::Log4perl qw(:easy); + +Log::Log4perl->easy_init($WARN); +my $logger = Log::Log4perl::get_logger; +Gscan2pdf::Document->setup($logger); + +# Create test image +system('convert rose: page1.pdf'); +my $content = <<'EOS'; +%PDF-1.4 +1 0 obj + << /Type /Catalog + /Outlines 2 0 R + /Pages 3 0 R + >> +endobj + +2 0 obj + << /Type /Outlines + /Count 0 + >> +endobj + +3 0 obj + << /Type /Pages + /Kids [ 4 0 R ] + /Count 1 + >> +endobj + +4 0 obj + << /Type /Page + /Parent 3 0 R + /MediaBox [ 0 0 612 792 ] + /Contents 5 0 R + /Resources << /ProcSet 6 0 R + /Font << /F1 7 0 R >> + >> +>> +endobj + +5 0 obj + << /Length 73 >> +stream + BT + /F1 24 Tf + 100 100 Td + ( Hello World ) Tj + ET +endstream +endobj +xref +0 8 +0000000000 65535 f +0000000010 00000 n +0000000020 00000 n +0000000030 00000 n +0000000040 00000 n +0000000050 00000 n +0000000060 00000 n +0000000070 00000 n +trailer +<> +startxref +555 +%%EOF +EOS +open my $fh, '>', 'page2.pdf' or die 'Cannot open page2.pdf'; +print $fh $content; +close $fh; +system('pdftk page1.pdf page2.pdf cat output test.pdf'); + +my $slist = Gscan2pdf::Document->new; + +# dir for temporary files +my $dir = File::Temp->newdir; +$slist->set_dir($dir); + +$slist->get_file_info( + path => 'test.pdf', + finished_callback => sub { + my ($info) = @_; + $slist->import_file( + info => $info, + first => 1, + last => 2, + finished_callback => sub { + is( $#{ $slist->{data} }, 0, 'imported 1 image' ); + Gtk2->main_quit; + } + ); + } +); +Gtk2->main; + +######################### + +unlink 'page1.pdf', 'page2.pdf', 'test.pdf', <$dir/*>; +rmdir $dir; +Gscan2pdf::Document->quit(); -- 1.8.1