Simple accounting filter/backend (With Perl or another script language)

Nayco (.free.fr) nayco at spam.me
Wed Oct 27 07:44:40 PDT 2004


Jerome Alet wrote:
> If you want you can even use the file in question (pdlanalyzer.py)
> completely independantly of PyKota (no need to install anything
> beside Python and this file, although Python-Psyco is recommended
> for performance reasons). This will give you instant support
> for PostScript (binary and DSC compliant), PDF, PCL3, PCL4, PCL5,
> PCLXL (aka PCL6), and ESC/P2. So instead of launching
> gs + bbox, just launch "python pdlanalyzer.py file1.ps ..."
> (or use a pipe)

Ok, just a few more tests and I'll consider this solution. I mean, this is python, and I don't know this language. Moreover, it'd force me to ship two scripts in two different languages... To be honest, i'd prefer _one_ monolithic script and _one_ language I can handle. But your script seem really more powerful and versatile, so I keep it at hand.

> Just keep in mind that it's NOT perfect, and that some day you'll
> find a PostScript file which fools your program either intentionnally
> or not.

That's ok. Remember, I just wanted to provide a simple solution, only to keep track of printer usage by users, no billing, and maybe no quotas... Well, for the quotas, I'd like to, so I may try if the first stage completes well, thanks to your help ;-) !

Here's my first snippet of the new page counting part. I seems to work, I just need to reorganize it to "[use the most accurate method] or [fallback to a less accurate] or [fallback to a less accurate] ... or [Pages=-1 ;-)]". Comments ?

---------------------------------------------------------
#!/usr/bin/perl -w
use strict;

my $doc="toto.ps";

my ($page_num_pages,$page_num_copies,$copies_num_copies,$page_bbox)=(0,0,0,0);

open DOC, $doc;
while (<DOC>){
  if( $_ =~ m/^%%Pages:\s+([0-9]+)$/ ){
    $page_num_pages=$1;
  }
  if ( $_ =~ m/1\s+dict\s+dup\s+\/NumCopies\s+([0-9]+)\s+/ ){
    $copies_num_copies=$1;
    $page_num_copies++;
  }
}

my $page_bbox_cmd = "/usr/bin/gs -sDEVICE=bbox -dNOPAUSE -c save pop -f ".$doc." -c quit 2>&1";

my $page_bbox_result = `$page_bbox_cmd`;
if (!defined $page_bbox_result || !$!){
  die "$0: Unable to count pages with bbox method !\n";
}

foreach my $page_bbox_line ( $page_bbox_result ){
  if ($page_bbox_line =~ m/%%BoundingBox/){
    $page_bbox++;
  }
}

print "Page count data:\n  page_num_pages: $page_num_pages\n  copies_num_copies: $copies_num_copies\n";
print "  page_num_copies: $page_num_copies\n  page_bbox: $page_bbox\n";
---------------------------------------------------------

At execution (toto is my test PS - 37 copies - 2 pages):
$ ./compte_ps
Page count data:
  page_num_pages: 2
  copies_num_copies: 37
  page_num_copies: 2
  page_bbox: 1 (?)

So, what I think, now:

if ("NumCopies")
  use this to guess number of copies and pages
else if ("%%Pages:")
  use this for pages
else
  fallback to bbox for pages
else
  nothing accurate found, use "NULL"
end
  total_pages=pages*copies or NULL

Well, the flaw is that if someone ask for 500 copies of a 1 page document, we're screwed...






More information about the cups-devel mailing list