|
Lines 3-9
package C4::Labels::Label;
Link Here
|
| 3 |
use strict; |
3 |
use strict; |
| 4 |
use warnings; |
4 |
use warnings; |
| 5 |
|
5 |
|
| 6 |
use Text::Wrap; |
|
|
| 7 |
use Algorithm::CheckDigits; |
6 |
use Algorithm::CheckDigits; |
| 8 |
use Text::CSV_XS; |
7 |
use Text::CSV_XS; |
| 9 |
use Data::Dumper; |
8 |
use Data::Dumper; |
|
Lines 381-386
sub create_label {
Link Here
|
| 381 |
return; |
380 |
return; |
| 382 |
} |
381 |
} |
| 383 |
|
382 |
|
|
|
383 |
sub wrap_fields_proportional { |
| 384 |
my ($self, %params) = @_; |
| 385 |
my $font = $params{'font'}; |
| 386 |
my $font_size = $params{'font_size'}; |
| 387 |
my $field_data = $params{'field_data'}; |
| 388 |
my @lines; |
| 389 |
|
| 390 |
my $field_length = length $field_data; |
| 391 |
my @fieldchar_map; |
| 392 |
my @fieldwidth_map; |
| 393 |
my @fieldcharwidthsum_map; |
| 394 |
my $fieldcharwidthsum = 0.0; # adjusted for margins to align with draw_label_text |
| 395 |
my $line_startpos = 0; |
| 396 |
my $ignore_subsequent_lines = 0; |
| 397 |
|
| 398 |
# build lookup maps and use them to scan backward to break on space when truncation would be detected. |
| 399 |
my $idx = 0; |
| 400 |
for ( $idx=0; $idx <= $field_length; $idx++ ) { |
| 401 |
my $fieldchar = substr $field_data, $idx, 1; |
| 402 |
$fieldchar_map[$idx] = $fieldchar; |
| 403 |
|
| 404 |
my $fieldchar_width = C4::Creators::PDF->StrWidth($fieldchar, $font, $self->{'font_size'}); |
| 405 |
$fieldcharwidthsum = $fieldcharwidthsum + $fieldchar_width; |
| 406 |
$fieldcharwidthsum_map[$idx] = $fieldcharwidthsum; # accumulation of field widths for this field_data |
| 407 |
|
| 408 |
if ( $fieldcharwidthsum > ($self->{'width'} - $self->{'left_text_margin'}) ) { # truncation detect |
| 409 |
|
| 410 |
# search backward until space to break text on. |
| 411 |
my $space_start_idx = $idx - 1; # start from current position - 1 |
| 412 |
|
| 413 |
SPACESCAN: for ( my $space_idx = $space_start_idx; $space_idx >= 0; $space_idx--) { # in reverse |
| 414 |
|
| 415 |
if ( $fieldchar_map[$space_idx] eq ' ' ) { |
| 416 |
my $line_length = $space_idx - $line_startpos; |
| 417 |
my $text_line = substr $field_data, $line_startpos, $line_length; |
| 418 |
push @lines, $text_line; |
| 419 |
|
| 420 |
if ( ! $self->{'text_wrap_cols'} ) { $ignore_subsequent_lines = 1; } # so we don't write more |
| 421 |
|
| 422 |
$line_startpos = $space_idx + 1; |
| 423 |
|
| 424 |
# re-adjust fieldcharwidthsum to start from line_startpos thru current idx of master loop |
| 425 |
$fieldcharwidthsum = 0.0; |
| 426 |
for ( my $widthsum_idx = $line_startpos; $widthsum_idx <= $idx; $widthsum_idx++ ) { |
| 427 |
my $fc = substr $field_data, $widthsum_idx, 1; |
| 428 |
my $fcw = C4::Creators::PDF->StrWidth($fc, $font, $self->{'font_size'}); |
| 429 |
$fieldcharwidthsum = $fieldcharwidthsum + $fcw; |
| 430 |
} |
| 431 |
|
| 432 |
last SPACESCAN; |
| 433 |
} |
| 434 |
} |
| 435 |
} |
| 436 |
} |
| 437 |
|
| 438 |
# flush what didn't get flushed from truncation if we haven't written anything yet. |
| 439 |
if ( $ignore_subsequent_lines == 0 ) { |
| 440 |
my $line_length = $field_length - $line_startpos; |
| 441 |
my $text_line = substr $field_data, $line_startpos, $line_length; |
| 442 |
push @lines, $text_line; |
| 443 |
} |
| 444 |
|
| 445 |
return \@lines; |
| 446 |
} |
| 447 |
|
| 384 |
sub draw_label_text { |
448 |
sub draw_label_text { |
| 385 |
my ($self, %params) = @_; |
449 |
my ($self, %params) = @_; |
| 386 |
my @label_text = (); |
450 |
my @label_text = (); |
|
Lines 430-437
sub draw_label_text {
Link Here
|
| 430 |
$field_data =~ s/\(/\\\(/g; # Escape '(' and ')' for the pdf object stream... |
494 |
$field_data =~ s/\(/\\\(/g; # Escape '(' and ')' for the pdf object stream... |
| 431 |
$field_data =~ s/\)/\\\)/g; |
495 |
$field_data =~ s/\)/\\\)/g; |
| 432 |
} |
496 |
} |
| 433 |
eval{$Text::Wrap::columns = $self->{'text_wrap_cols'};}; |
497 |
|
| 434 |
my @line = split(/\n/ ,wrap('', '', $field_data)); |
498 |
my @line = @{ wrap_fields_proportional( $self, |
|
|
499 |
font => $font, |
| 500 |
font_size => $self->{'font_size'}, |
| 501 |
field_data => $field_data |
| 502 |
) }; |
| 503 |
|
| 435 |
# If this is a title field, limit to two lines; all others limit to one... FIXME: this is rather arbitrary |
504 |
# If this is a title field, limit to two lines; all others limit to one... FIXME: this is rather arbitrary |
| 436 |
if ($field->{'code'} eq 'title' && scalar(@line) >= 2) { |
505 |
if ($field->{'code'} eq 'title' && scalar(@line) >= 2) { |
| 437 |
while (scalar(@line) > 2) { |
506 |
while (scalar(@line) > 2) { |
|
Lines 452-460
sub draw_label_text {
Link Here
|
| 452 |
$text_llx = $params{'llx'} + $self->{'width'} - ($self->{'left_text_margin'} + $string_width); |
521 |
$text_llx = $params{'llx'} + $self->{'width'} - ($self->{'left_text_margin'} + $string_width); |
| 453 |
} |
522 |
} |
| 454 |
elsif($self->{'justify'} eq 'C') { |
523 |
elsif($self->{'justify'} eq 'C') { |
| 455 |
# some code to try and center each line on the label based on font size and string point width... |
524 |
# some code to try and center each line on the label based on font size and string point width... |
| 456 |
my $whitespace = ($self->{'width'} - ($string_width + (2 * $self->{'left_text_margin'}))); |
525 |
my $whitespace = ($self->{'width'} - ($string_width + (2 * $self->{'left_text_margin'}))); |
| 457 |
$text_llx = (($whitespace / 2) + $params{'llx'} + $self->{'left_text_margin'}); |
526 |
$text_llx = (($whitespace / 2) + $params{'llx'} + $self->{'left_text_margin'}); |
| 458 |
} |
527 |
} |
| 459 |
else { |
528 |
else { |
| 460 |
$text_llx = ($params{'llx'} + $self->{'left_text_margin'}); |
529 |
$text_llx = ($params{'llx'} + $self->{'left_text_margin'}); |
| 461 |
- |
|
|