Koha/barcodes/label-print-pdf.pl

603 lines
15 KiB
Perl
Executable file

#!/usr/bin/perl
#----------------------------------------------------------------------
# this script is really divided into 2 differenvt section,
# the first section creates, and defines the new PDF file the barcodes
# using PDF::Reuse::Barcode, then saves the file to disk.
# the second section then opens the pdf file off disk, and places the spline label
# text in the left-most column of the page. then save the file again.
# the reason for this goofyness, is that i couldnt find a single perl PDF package that handled both barcodes and decent text placement.
#use lib '/usr/local/opus-dev/intranet/modules';
#use C4::Context("/etc/koha-opus-dev.conf");
#use strict;
use CGI;
use C4::Auth;
use C4::Bull;
use C4::Output;
use C4::Interface::CGI::Output;
use C4::Context;
use HTML::Template;
use PDF::Reuse;
use PDF::Reuse::Barcode;
use PDF::Report;
#use Acme::Comment;
#use Data::Dumper;
my $htdocs_path = C4::Context->config('intrahtdocs');
my $cgi = new CGI;
my $spine_text = "";
# get the printing settings
my $dbh = C4::Context->dbh;
my $query2 = " SELECT * FROM labels_conf LIMIT 1 ";
my $sth = $dbh->prepare($query2);
$sth->execute();
my $conf_data = $sth->fetchrow_hashref;
# get barcode type from $conf_data
my $barcodetype = $conf_data->{'barcodetype'};
my $startrow = $conf_data->{'startrow'};
#warn Dumper $conf_data;
#warn Dumper $barcodetype;
$sth->finish;
# get the actual items to be printed.
my @data;
my $query3 = " Select * from labels ";
my $sth = $dbh->prepare($query3);
$sth->execute();
my @resultsloop;
my $cnt = $sth->rows;
my $i1 = 1;
while ( my $data = $sth->fetchrow_hashref ) {
# lets get some summary info from each item
my $query1 =
" select * from biblio, biblioitems, items where itemnumber = ? and
items.biblioitemnumber=biblioitems.biblioitemnumber and
biblioitems.biblionumber=biblio.biblionumber";
my $sth1 = $dbh->prepare($query1);
$sth1->execute( $data->{'itemnumber'} );
my $data1 = $sth1->fetchrow_hashref();
push( @resultsloop, $data1 );
$sth1->finish;
$i1++;
}
$sth->finish;
# dimensions of gaylord paper
my $lowerLeftX = 0;
my $lowerLeftY = 0;
my $upperRightX = 612;
my $upperRightY = 792;
#----------------------------------
# setting up the pdf doc
prFile("$htdocs_path/barcodes/new.pdf");
prLogDir("$htdocs_path/barcodes");
#prMbox ( $lowerLeftX, $lowerLeftY, $upperRightX, $upperRightY );
prMbox( 0, 0, 612, 792 );
prFont('Times-Roman'); # Just setting a font
prFontSize(10);
my $margin = 36;
my $label_height = 90;
my $spine_width = 72;
my $circ_width = 207;
my $colspace = 27;
my $x_pos_spine = 36;
my $x_pos_circ1 = 135;
my $x_pos_circ2 = 369;
my $pageheight = 792;
#warn "STARTROW = $startrow\n";
my $y_pos_initial = ( ( $pageheight - $margin ) - $label_height );
my $y_pos_initial_startrow =
( ( $pageheight - $margin ) - ( $label_height * $startrow ) );
my $y_pos_initial = ( ( 792 - 36 ) - 90 );
#warn "Y POS INITAL : $y_pos_initial";
warn "Y START ROW = $y_pos_initial_startrow";
my $y_pos = $y_pos_initial_startrow;
#my $y_pos = $y_pos_initial;
my $rowspace = 36;
my $page_break_count = $startrow;
my $codetype = 'Code39';
# do border---------------
my $str = "q\n"; # save the graphic state
$str .= "4 w\n"; # border color red
$str .= "0.0 0.0 0.0 RG\n"; # border color red
$str .= "1 1 1 rg\n"; # fill color blue
$str .= "0 0 612 792 re\n"; # a rectangle
$str .= "B\n"; # fill (and a little more)
$str .= "Q\n"; # save the graphic state
# do border---------------
prAdd($str);
my $item;
# for loop
my $i2 = 1;
foreach $item (@resultsloop) {
if ( $i2 == 1 ) {
# draw_boxes();
}
#warn Dumper $item->{'itemtype'};
#warn "COUNT = $cnt1";
#building up spine text
my $line = 75;
my $line_spacer = 16;
$DB::single = 1;
#warn
"COUNT=$i2, PBREAKCNT=$page_break_count, X,Y POS x=$x_pos_circ1, y=$y_pos";
build_circ_barcode( $x_pos_circ1, $y_pos, $item->{'barcode'},
$conf_data->{'barcodetype'} );
build_circ_barcode( $x_pos_circ2, $y_pos, $item->{'barcode'},
$conf_data->{'barcodetype'} );
# added for xpdf compat. doesnt use type3 fonts., but increases filesize from 20k to 200k
# i think its embedding extra fonts in the pdf file.
# mode => 'graphic',
$y_pos = ( $y_pos - $label_height );
# the gaylord labels have 8 rows per sheet, this pagebreaks after 8 rows
if ( $page_break_count == 8 ) {
prPage();
#warn "############# PAGEBREAK ###########";
$page_break_count = 0;
$i2 = 0;
$y_pos = $y_pos_initial;
}
$page_break_count++;
$i2++;
}
############## end of loop
prEnd();
#----------------------------------------------------------------------------
# this second section of the script uses a diff perl class than the previous section
# it opens the 'new.pdf' file that the previous section has just saved
$file = '/usr/local/opus-dev/intranet/htdocs/intranet-tmpl/barcodes/new.pdf';
my $pdf = new PDF::Report( File => $file );
# my $pdf = new PDF::Report(PageSize => "letter",
# PageOrientation => "Landscape");
#$pdf->newpage($nopage);
my $pagenumber = 1;
$pdf->openpage($pagenumber);
( $pagewidth, $pageheight ) = $pdf->getPageDimensions();
warn "PAGE DIM = $pagewidth, $pageheight";
warn "Y START ROW = $y_pos_initial_startrow";
my $y_pos = ( $y_pos_initial_startrow + 90 );
warn "Y POS = $y_pos";
$pdf->setAlign('left');
$pdf->setSize(11);
my $page_break_count = $startrow;
warn "INIT PAGEBREAK COUNT = $page_break_count";
warn "#----------------------------------\n";
warn "INIT VPOS = $vPos, hPos = $hPos";
my $vPosSpacer = 15;
my $start_text_pos = 39; # ( 36 - 5 = 31 ) 5 is an inside border for text.
my $spine_label_text_with = 67;
foreach $item (@resultsloop) {
#warn Dumper $item;
warn "START Y_POS=$y_pos";
my $firstrow = 0;
$pdf->setAddTextPos( $start_text_pos, ( $y_pos - 20 ) ); # INIT START POS
( $hPos, $vPos ) = $pdf->getAddTextPos();
my $hPosEnd = ( $hPos + $spine_label_text_with ); # 72
if ( $conf_data->{'dewey'} && $item->{'dewey'} ) {
( $hPos, $vPos1 ) = $pdf->getAddTextPos();
$pdf->centerString( $hPos, $hPosEnd, $vPos, $item->{'dewey'} );
$vPos = $vPos - $vPosSpacer;
}
if ( $conf_data->{'isbn'} && $item->{'isbn'} ) {
( $hPos, $vPos1 ) = $pdf->getAddTextPos();
$pdf->centerString( $hPos, $hPosEnd, $vPos, $item->{'isbn'} );
$vPos = $vPos - $vPosSpacer;
}
if ( $conf_data->{'class'} && $item->{'classification'} ) {
( $hPos, $vPos1 ) = $pdf->getAddTextPos();
$pdf->centerString( $hPos, $hPosEnd, $vPos, $item->{'classification'} );
$vPos = $vPos - $vPosSpacer;
}
if ( $conf_data->{'itemtype'} && $item->{'itemtype'} ) {
( $hPos, $vPos1 ) = $pdf->getAddTextPos();
$pdf->centerString( $hPos, $hPosEnd, $vPos, $item->{'itemtype'} );
$vPos = $vPos - $vPosSpacer;
}
#$pdf->drawRect(
# $x_pos_spine, $y_pos,
# ( $x_pos_spine + $spine_width ),
# ( $y_pos - $label_height )
#);
$y_pos = ( $y_pos - $label_height );
#warn "END LOOP Y_POS =$y_pos";
# warn "PAGECOUNT END LOOP=$page_break_count";
if ( $page_break_count == 8 ) {
$pagenumber++;
$pdf->openpage($pagenumber);
#warn "############# PAGEBREAK ###########";
$page_break_count = 0;
$i2 = 0;
$y_pos = ( $y_pos_initial + 90 );
}
$page_break_count++;
$i2++;
warn "#----------------------------------\n";
}
$DB::single = 1;
$pdf->saveAs($file);
#------------------------------------------------
print $cgi->redirect("/intranet-tmpl/barcodes/new.pdf");
# draw boxes------------------
sub draw_boxes {
# warn "IN DRAW_BOXES\in";
my $y_pos_initial = ( ( 792 - 36 ) - 90 );
my $y_pos = $y_pos_initial;
my $i = 1;
for ( $i = 1 ; $i <= 8 ; $i++ ) {
&drawbox( $x_pos_spine, $y_pos, ($spine_width), ($label_height) );
#warn "OLD BOXES x=$x_pos_spine, y=$y_pos, w=$spine_width, h=$label_height";
&drawbox( $x_pos_circ1, $y_pos, ($circ_width), ($label_height) );
&drawbox( $x_pos_circ2, $y_pos, ($circ_width), ($label_height) );
$y_pos = ( $y_pos - $label_height );
}
}
# draw boxes------------------
#-----------------------------
# this is pretty ugly too.
sub build_circ_barcode {
my ( $x_pos_circ, $y_pos, $value, $barcodetype ) = @_;
#warn "value = $value\n";
#$DB::single = 1;
if ( $barcodetype eq 'EAN13' ) {
#testing EAN13 barcodes hack
$value = $value . '000000000';
$value =~ s/-//;
$value = substr( $value, 0, 12 );
#warn $value;
eval {
PDF::Reuse::Barcode::EAN13(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
# prolong => 2.96,
# xSize => 1.5,
# ySize => 1.2,
# added for xpdf compat. doesnt use type3 fonts., but increases filesize from 20k to 200k
# i think its embedding extra fonts in the pdf file.
# mode => 'graphic',
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "EAN13BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'Code39' ) {
eval {
PDF::Reuse::Barcode::Code39(
x => ( $x_pos_circ + 9 ),
y => ( $y_pos + 15 ),
value => $value,
# prolong => 2.96,
xSize => .85,
ySize => 1.3,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "CODE39BARCODE $value FAILED:$@";
}
#warn $barcodetype;
}
elsif ( $barcodetype eq 'Matrix2of5' ) {
warn "MATRIX ELSE:";
#testing MATRIX25 barcodes hack
# $value = $value.'000000000';
$value =~ s/-//;
# $value = substr( $value, 0, 12 );
#warn $value;
eval {
PDF::Reuse::Barcode::Matrix2of5(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
# prolong => 2.96,
# xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'EAN8' ) {
#testing ean8 barcodes hack
$value = $value . '000000000';
$value =~ s/-//;
$value = substr( $value, 0, 8 );
#warn $value;
warn "EAN8 ELSEIF";
eval {
PDF::Reuse::Barcode::EAN8(
x => ( $x_pos_circ + 42 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'UPC-E' ) {
eval {
PDF::Reuse::Barcode::UPCE(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'NW7' ) {
eval {
PDF::Reuse::Barcode::NW7(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'ITF' ) {
eval {
PDF::Reuse::Barcode::ITF(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'Industrial2of5' ) {
eval {
PDF::Reuse::Barcode::Industrial2of5(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'IATA2of5' ) {
eval {
PDF::Reuse::Barcode::IATA2of5(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'COOP2of5' ) {
eval {
PDF::Reuse::Barcode::COOP2of5(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
elsif ( $barcodetype eq 'UPC-A' ) {
eval {
PDF::Reuse::Barcode::UPCA(
x => ( $x_pos_circ + 27 ),
y => ( $y_pos + 15 ),
value => $value,
prolong => 2.96,
xSize => 1.5,
# ySize => 1.2,
);
};
if ($@) {
$item->{'barcodeerror'} = 1;
warn "BARCODE FAILED:$@";
}
warn $barcodetype;
}
}
#-----------------------------
sub drawbox {
my ( $llx, $lly, $urx, $ury ) = @_;
my $str = "q\n"; # save the graphic state
$str .= "1.0 0.0 0.0 RG\n"; # border color red
$str .= "1 1 1 rg\n"; # fill color blue
$str .= "$llx $lly $urx $ury re\n"; # a rectangle
$str .= "B\n"; # fill (and a little more)
$str .= "Q\n"; # save the graphic state
prAdd($str);
}