File Coverage

blib/lib/Scanner/Job.pm
Criterion Covered Total %
statement 16 18 88.8
branch n/a
condition n/a
subroutine 6 6 100.0
pod n/a
total 22 24 91.6


line stmt bran cond sub pod time code
1             #================================= Job.pm ====================================
2             # Filename: Job.pm
3             # Description: Handle a scanning job, where job is usually a document.
4             # Original Author: Dale M. Amon
5             # Revised by: $Author: amon $
6             # Date: $Date: 2008-08-28 23:31:44 $
7             # Version: $Revision: 1.3 $
8             # License: LGPL 2.1, Perl Artistic or BSD
9             #
10             #=============================================================================
11 1     1   542 use strict;
  1         1  
  1         25  
12 1     1   5 use File::Spec;
  1         1  
  1         31  
13 1     1   756 use Fault::DebugPrinter;
  1         352  
  1         20  
14 1     1   698 use Fault::ErrorHandler;
  1         316  
  1         27  
15 1     1   938 use Fault::Logger;
  1         24996  
  1         27  
16              
17 1     1   1876 use Document::Directory;
  0            
  0            
18             use Document::PageIterator;
19             use Document::PageId;
20              
21             use Scanner::Device;
22             use Scanner::Format;
23             use Scanner::Page;
24              
25             package Scanner::Job;
26             use vars qw{@ISA};
27             @ISA = qw( UNIVERSAL );
28              
29             #=============================================================================
30             # CLASS METHODS
31             #=============================================================================
32              
33             sub new {
34             my ($class,$scanner,$firstpage,$format,$Spine_Width_Inches,$Total_Sheets,
35             $path,$date,$publication) = @_;
36             my $self = bless {}, $class;
37              
38             my $pgformat = Scanner::Format->new ('format' => $format);
39             if (!defined $pgformat) {
40             Fault::ErrorHandler->warn ("Invalid page format");
41             return undef;
42             }
43              
44             if ($Total_Sheets <= 0) {
45             Fault::ErrorHandler->warn ("Total Sheets cannot be zero!");
46             return undef;
47             }
48              
49             if ($Spine_Width_Inches <= 0.0) {
50             Fault::ErrorHandler->warn ("Spine Width cannot be 0.0 inches!");
51             return undef;
52             }
53              
54             my ($w,$h) = $pgformat->UserDimensions;
55             my $so = $pgformat->orientation;
56             my $sw = ($pgformat->portrait) ? $Spine_Width_Inches : $w;
57             my $sh = ($pgformat->landscape) ? $Spine_Width_Inches : $h;
58             my $spine = Scanner::Format->new ('format' => "${so}:${sw}x${sh}");
59              
60             my @parse = Document::PageId->parse ($firstpage);
61              
62             if ( !($parse[0] and !$parse[1])) {
63             Fault::ErrorHandler->warn
64             ("First page is not in a recognizable format: \"$firstpage\"");
65             return undef;
66             }
67              
68             $self->{'scanner'} = $scanner;
69             $self->{'FirstPage'} = $firstpage;
70             $self->{'PageFormat'} = $pgformat;
71             $self->{'SpineFormat'} = $spine;
72             $self->{'Total_Sheets'} = $Total_Sheets;
73              
74             $self->{'pgspersheet'} = 1;
75             $self->{'batchlen'} = 1;
76             $self->{'batchcnt'} = 0;
77             $self->{'PageTitle'} = "cover";
78             $self->{'FirstPageId'} = ($firstpage == 0) ?
79             "000a" : sprintf "%03d",$firstpage;
80              
81             $self->{'curpgobj1'} = Document::PageIterator->new ($self->{'FirstPageId'});
82             $self->{'curpgobj2'} = Document::PageIterator->new ($self->{'FirstPageId'});
83             $self->{'document'} = Document::Directory->open ($path,$date,$publication);
84              
85             return $self;
86             }
87              
88             #=============================================================================
89             # INSTANCE METHODS
90             #=============================================================================
91              
92             sub scan ($) {
93             my $self = shift;
94             my $fs = $self->{'document'}->filespec;
95             my ($pageid, $format, $title);
96              
97             if ($self->isSpine) {
98             $pageid = "000.spine";
99             $format = $self->{'SpineFormat'};
100             $title = "spine";
101             }
102             else {
103             $pageid = $self->pageid;
104             $format = $self->{'PageFormat'};
105             $title = $self->{'PageTitle'};
106             }
107            
108             my $curpage = Scanner::Page->new
109             ( 'date' => $fs->dates,
110             'title' => $fs->undated_filename,
111             'pageid' => $pageid,
112             'format' => $format
113             );
114             $self->{'scanner'}->scan ($curpage, $fs->pathname);
115            
116             Fault::DebugPrinter->dbg (2, "Scan page " . $pageid);
117              
118             $self->{'document'}->add ($pageid,($title) );
119             return $self;
120             }
121              
122             #-----------------------------------------------------------------------------
123              
124             sub nextPageNumbers {
125             my $self = shift;
126             my ($curpgobj1,$curpgobj2) = @$self{'curpgobj1','curpgobj2'};
127              
128             if ($self->{'pgspersheet'} == 1) {
129             $curpgobj1->nextid(1);
130             }
131             else {
132             $curpgobj1->setpageid ($curpgobj2->get);
133             $curpgobj1->nextid (1);
134             $curpgobj2->setpageid ($curpgobj1->get);
135             $curpgobj2->nextid (1);
136             }
137             return $self;
138             }
139              
140             #-----------------------------------------------------------------------------
141              
142             sub pageid {
143             my ($self) = shift;
144             my ($pgobj1,$pgobj2) = @$self{'curpgobj1','curpgobj2'};
145              
146             my $pg1 = (defined $pgobj1) ? $pgobj1->get : "UNDEF";
147             my $pg2 = (defined $pgobj2) ? $pgobj2->get : "UNDEF";
148             return ($self->{'pgspersheet'} == 1) ? $pg1 : "$pg1-$pg2";
149             }
150              
151             #-----------------------------------------------------------------------------
152              
153             sub guessPageTitle {
154             my ($self) = shift;
155             my ($pgobj1,$pgobj2) = @$self{'curpgobj1','curpgobj2'};
156             my $str;
157              
158             if ( $pgobj1->get eq "000.spine") {$str = "spine";}
159             else {$str = ($pgobj1->get eq $self->{'FirstPageId'}) ? "cover" : "";}
160              
161             $self->{'PageTitle'} = $str;
162             return $str;
163             }
164              
165             #-----------------------------------------------------------------------------
166              
167             sub setPagesPerSheet {
168             my ($self,$pgs) = (shift,shift);
169             if ($pgs < 0 or $pgs > 2) {return undef;}
170             $self->{'pgspersheet'} = $pgs;
171             if ($pgs == 2) {
172             $self->{'curpgobj2'}->setpageid ($self->{'curpgobj1'}->get);
173             $self->{'curpgobj2'}->nextid (1);
174             }
175             return $self->{'pgspersheet'};
176             }
177              
178             #-----------------------------------------------------------------------------
179              
180             sub setPagesPerSheetAsIn {
181             my ($self,$line) = (shift,shift);
182             my ($pgobj1,$pgobj2) = @$self{'curpgobj1','curpgobj2'};
183              
184             my ($one,$two) = split (/-/, $line, 2);
185             if (defined $one) {
186             $pgobj1->setpageid ($one);
187             $self->setPagesPerSheet (1);
188             if (defined $two) {$pgobj2->setpageid ($two);}
189             else {$pgobj2->setpageid ($one);}
190            
191             $self->{'pgspersheet'} = ($pgobj1->get eq $pgobj2->get) ? 1 : 2;
192             }
193             return $self->{'pgspersheet'};
194             }
195              
196             #-----------------------------------------------------------------------------
197              
198             sub setBatchLength {
199             my ($self,$n) = (shift,shift);
200             $n=1 if ($n == 0);
201              
202             $self->{'batchlen'}=$n;
203             return $n;
204             }
205              
206             #-----------------------------------------------------------------------------
207              
208             sub info ($) {
209             my $self = shift;
210              
211             printf "[Job]\n" .
212             "First page: %s\n" .
213             "Pages Per Sheet: %d\n" .
214             "Total Sheets: %d\n" .
215             "Batch Length: %d\n" .
216             "Batch Down Counter: %d\n",
217             @$self{'FirstPage', 'pgspersheet',
218             'Total_Sheets', 'batchlen', 'batchcnt'};
219              
220             printf ("\n"); $self->{'scanner'}->info;
221             printf ("\n"); $self->{'document'}->info;
222             printf ("\n"); $self->{'PageFormat'}->info ("Page");
223             printf ("\n"); $self->{'SpineFormat'}->info ("Spine");
224             printf ("\n");
225              
226             return $self;
227             }
228              
229             #-----------------------------------------------------------------------------
230              
231             sub isSpine {my $self = shift;
232             return ($self->{'PageTitle'} eq "spine");}
233              
234             sub setPageTitle {my $self = shift; $self->{'PageTitle'} = shift;
235             return $self->{'PageTitle'};}
236              
237             sub initBatchCnt {my $self=shift; $self->{'batchcnt'}=$self->{'batchlen'};
238             return $self->{'batchcnt'};}
239              
240             sub decBatchCnt {my $self = shift;
241             if (--$self->{'batchcnt'} < 0) {$self->{'batchcnt'}=0;}
242             return $self->{'batchcnt'};}
243              
244             sub pageTitle {return shift->{'PageTitle'};}
245             sub totalSheets {return shift->{'Total_Sheets'};}
246             sub batchLength {return shift->{'batchlen'};}
247             sub pagesPerSheet {return shift->{'pgspersheet'};}
248            
249             #=============================================================================
250             # POD DOCUMENTATION
251             #=============================================================================
252             # You may extract and format the documention section with the 'perldoc' cmd.
253              
254             =head1 NAME
255              
256             Scanner::Job - Handle a scanning job, where job is usually a document.
257              
258             =head1 SYNOPSIS
259              
260             use Scanner::Job;
261             $obj = Scanner::Job->new($scanner,$firstpage,$format,$spine_width_inches,$total_sheets,$path,$date,$publication);
262              
263             $obj = $obj->scan;
264             $obj = $obj->nextPageNumbers;
265             $str = $obj->pageid;
266             $str = $obj->guessPageTitle;
267             $num = $obj->setPagesPerSheet ($pgs);
268             $num = $obj->setPagesPerSheetAsIn ($line);
269             $num = $obj->setBatchLength ($num);
270             $flg = $obj->isSpine;
271             $str = $obj->setPageTitle;
272             $num = $obj->initBatchCnt;
273             $num = $obj->decBatchCnt;
274             $str = $obj->pageTitle;
275             $num = $obj->totalSheets;
276             $num = $obj->batchLength;
277             $num = $obj->pagesPerSheet;
278              
279             =head1 Inheritance
280              
281             UNIVERSAL
282              
283             =head1 Description
284              
285             Handle a scanning job, where job is usually a document.
286              
287             =head1 Examples
288              
289             None.
290              
291             =head1 Class Variables
292              
293             None.
294              
295             =head1 Instance Variables
296              
297             FirstPage String identifying the number portion of the first
298             page scanned. eg "000"
299             FirstPageId String identifying the the first page scanned, including
300             subpage numbers and such. eg "000a"
301             FormatPage Scanner::Format object for pages
302             SpineFormat Scanner::Format object for spine.
303             scanner Scanner object.
304             Total_Sheets Total sheets in document. Not really used yet.
305             pgspersheet Pages per scanned sheet. Usually 1 or 2.
306             batchlen Number of pages in ADF scan batch.
307             batchcnt Page count of ADF scan batch.
308             PageTitle Type of page. cover, backcover, contents...
309             curpgobj1 Document::PageIterator for the page, or of the left
310             hand page if there are two.
311             curpgobj2 Document::PageIterator for the page, or of the right
312             hand page if there are two.
313              
314             =head1 Class Methods
315              
316             =over 4
317              
318             =item B<$obj = Scanner::Job-Enew ($scanner,$firstpage,$format,$spine_width_inches,$total_sheets,$path,$date,$publication)>
319              
320             Create and initialize instances of Scanner::Job.
321              
322             scanner A Scanner object.
323             firstpage Page number to begin scanning at.
324             format A page format string, ie "L:10x12"
325             spine_width_inches Width of the document spine.
326             total_sheets Total sheets in the document. Not really used yet.
327             path Where to put the document.
328             date Date of the document.
329             publication Name of the publication, title and author of book or
330             paper, etc.
331              
332             =head1 Instance Methods
333              
334             =over 4
335              
336             =item B<$obj = $obj-Escan>
337              
338             Set up the information for the next page of the document and scan it. The
339             page will be named, placed in its document directory and logged and added
340             to the table of contents file there.
341              
342             If the page name is the special token 'spine', then the special pageid of
343             "000.spine" is used instead of the current pageid and the document scan
344             format is set for the width of the spine in whichever dimension on the
345             scanbed is appropriate: scanner height if landscape; scanner width if
346             portrait.
347              
348             Returns self.
349              
350             =item B<$num = $obj-EnextPageNumbers>
351              
352             Increment the page number or numbers.
353              
354             Returns self.
355              
356             =item B<$str = $obj-Epageid>
357              
358             Return a pageid string made up from info from one or two pageid objects.
359             Returns or -
360              
361             =item B<$str = $obj-EguessPageTitle>
362              
363             Make our best guess at what the user is going to want for the title.
364             Returns PageTitle.
365              
366             =item B<$num = $obj-EsetPagesPerSheet ($pgs)>
367              
368             Set the number of pages per sheet and return the value when done.
369              
370             =item B<$num = $obj-EsetPagesPerSheetAsIn ($line)>
371              
372             Set the pages per sheet to match $line and return the result of doing so.
373              
374             =item B<$num = $obj-EsetBatchLength ($n)>
375              
376             Set the batch length and return the result of doing so.
377              
378             =item B<$flg = $obj-EisSpine>
379              
380             Return true if the page is the document spine, ie the page number is 000.spine.
381              
382             =item B<$str = $obj-EsetPageTitle>
383              
384             Set the page title and return the result of doing so.
385              
386             =item B<$num = $obj-EinitBatchCnt>
387              
388             Set the batch count to the batch length and return the result.
389              
390             =item B<$num = $obj-EdecBatchCnt>
391              
392             Decrement the batch count until it reaches 0. Returns the value
393             after the decrement.
394              
395             =item B<$str = $obj-EpageTitle>
396              
397             Returns the page title.
398              
399             =item B<$num = $obj-EtotalSheets>
400              
401             Returns the total sheets.
402              
403             =item B<$num = $obj-EbatchLength>
404              
405             Returns the batch length.
406              
407             =item B<$num = $obj-EpagesPerSheet>
408              
409             Returns the pages per sheet.
410              
411             =back 4
412              
413             =head1 Private Class Method
414              
415             None.
416              
417             =head1 Private Instance Methods
418              
419             None.
420              
421             =head1 Errors and Warnings
422              
423             None.
424              
425             =head1 KNOWN BUGS
426              
427             See TODO.
428              
429             =head1 SEE ALSO
430              
431             Document::LogFile, Document::TocFile, Document::Toc, Document::PageIterator,
432             Scanner, Scanner::Page
433              
434             =head1 AUTHOR
435              
436             Dale Amon
437              
438             =cut
439            
440             #=============================================================================
441             # CVS HISTORY
442             #=============================================================================
443             # $Log: Job.pm,v $
444             # Revision 1.3 2008-08-28 23:31:44 amon
445             # Major rewrite. Shuffled code between classes and add lots of features.
446             #
447             # Revision 1.2 2008-08-07 19:52:48 amon
448             # Upgrade source format to current standard.
449             #
450             # Revision 1.1.1.1 2008-08-06 21:36:11 amon
451             # Classes for scanner use abstractions.
452             #
453             # 20070511 Dale Amon
454             # Created.
455             1;