Revision 7cb1a2fe
Von Sven Schöling vor mehr als 5 Jahren hinzugefügt
modules/override/PDF/Table.pm | ||
---|---|---|
8 | 8 |
package PDF::Table; |
9 | 9 |
|
10 | 10 |
use Carp; |
11 |
use List::Util qw(sum); |
|
12 |
|
|
11 | 13 |
our $VERSION = '0.10.1'; |
12 | 14 |
|
13 | 15 |
print __PACKAGE__.' is version: '.$VERSION.$/ if($ENV{'PDF_TABLE_DEBUG'}); |
... | ... | |
548 | 550 |
# Calc real column widths and expand table width if needed. |
549 | 551 |
my $calc_column_widths; |
550 | 552 |
($calc_column_widths, $width) = CalcColumnWidths( $col_props, $width ); |
553 |
my $num_cols = scalar @{ $calc_column_widths }; |
|
551 | 554 |
|
552 | 555 |
# Lets draw what we have! |
553 | 556 |
my $row_index = 0; |
... | ... | |
570 | 573 |
# Check for safety reasons |
571 | 574 |
if( $bot_marg < 0 ) |
572 | 575 |
{ # This warning should remain i think |
573 |
carp "!!! Warning: !!! Incorrect Table Geometry! start_h (${height}) is above start_y (${table_top_y}). Setting bottom margin to end of sheet!\n"; |
|
576 |
#carp "!!! Warning: !!! Incorrect Table Geometry! start_h (${height}) is above start_y (${table_top_y}). Setting bottom margin to end of sheet!\n";
|
|
574 | 577 |
$bot_marg = 0; |
575 | 578 |
} |
576 | 579 |
|
... | ... | |
592 | 595 |
# Check for safety reasons |
593 | 596 |
if( $bot_marg < 0 ) |
594 | 597 |
{ # This warning should remain i think |
595 |
carp "!!! Warning: !!! Incorrect Table Geometry! next_y or start_y (${next_y}) is above next_h or start_h (${next_h}). Setting bottom margin to end of sheet!\n"; |
|
598 |
#carp "!!! Warning: !!! Incorrect Table Geometry! next_y or start_y (${next_y}) is above next_h or start_h (${next_h}). Setting bottom margin to end of sheet!\n";
|
|
596 | 599 |
$bot_marg = 0; |
597 | 600 |
} |
598 | 601 |
|
... | ... | |
680 | 683 |
my $cur_x = $xbase; |
681 | 684 |
my $leftovers = undef; # Reference to text that is returned from textblock() |
682 | 685 |
my $do_leftovers = 0; |
686 |
my ($colspan, @vertical_lines); |
|
683 | 687 |
|
684 | 688 |
# Process every cell(column) from current row |
685 | 689 |
for( my $column_idx = 0; $column_idx < scalar( @$record); $column_idx++ ) |
... | ... | |
732 | 736 |
// $col_props->[$column_idx]->{'default_text'} |
733 | 737 |
// $default_text; |
734 | 738 |
|
739 |
my $this_width; |
|
740 |
if (!$first_row && $cell_props->[$row_index][$column_idx]->{colspan}) { |
|
741 |
$colspan = -1 == $cell_props->[$row_index][$column_idx]->{colspan} |
|
742 |
? $num_cols - $column_idx |
|
743 |
: $cell_props->[$row_index][$column_idx]->{colspan}; |
|
744 |
my $last_idx = $column_idx + $colspan - 1; |
|
745 |
$this_width = sum @{ $calc_column_widths }[$column_idx..$last_idx]; |
|
746 |
|
|
747 |
} else { |
|
748 |
$this_width = $calc_column_widths->[$column_idx]; |
|
749 |
} |
|
750 |
|
|
735 | 751 |
# If the content is wider than the specified width, we need to add the text as a text block |
736 | 752 |
if( $record->[$column_idx] !~ m/(.\n.)/ and |
737 | 753 |
$record_widths->[$column_idx] and |
738 |
$record_widths->[$column_idx] <= $calc_column_widths->[$column_idx]
|
|
754 |
$record_widths->[$column_idx] <= $this_width
|
|
739 | 755 |
){ |
740 | 756 |
my $space = $pad_left; |
741 | 757 |
if ($justify eq 'right') |
742 | 758 |
{ |
743 |
$space = $calc_column_widths->[$column_idx] -($txt->advancewidth($record->[$column_idx]) + $pad_right);
|
|
759 |
$space = $this_width -($txt->advancewidth($record->[$column_idx]) + $pad_right);
|
|
744 | 760 |
} |
745 | 761 |
elsif ($justify eq 'center') |
746 | 762 |
{ |
747 |
$space = ($calc_column_widths->[$column_idx] - $txt->advancewidth($record->[$column_idx])) / 2;
|
|
763 |
$space = ($this_width - $txt->advancewidth($record->[$column_idx])) / 2;
|
|
748 | 764 |
} |
749 | 765 |
$txt->translate( $cur_x + $space, $text_start ); |
750 | 766 |
my %text_options; |
... | ... | |
759 | 775 |
$record->[$column_idx], |
760 | 776 |
x => $cur_x + $pad_left, |
761 | 777 |
y => $text_start, |
762 |
w => $calc_column_widths->[$column_idx] - $pad_left - $pad_right,
|
|
778 |
w => $this_width - $pad_left - $pad_right,
|
|
763 | 779 |
h => $cur_y - $bot_marg - $pad_top - $pad_bot, |
764 | 780 |
align => $justify, |
765 | 781 |
lead => $lead |
... | ... | |
793 | 809 |
} |
794 | 810 |
|
795 | 811 |
$cur_x += $calc_column_widths->[$column_idx]; |
812 |
|
|
813 |
push @vertical_lines, (!$colspan || (1 >= $colspan)) ? 1 : 0; |
|
814 |
$colspan-- if $colspan; |
|
796 | 815 |
} |
797 | 816 |
if( $do_leftovers ) |
798 | 817 |
{ |
... | ... | |
826 | 845 |
$gfx_bg->fill(); |
827 | 846 |
} |
828 | 847 |
$cur_x += $calc_column_widths->[$column_idx]; |
848 |
|
|
849 |
if ($line_w && $vertical_lines[$column_idx] && ($column_idx != (scalar(@{ $record }) - 1))) { |
|
850 |
$gfx->move($cur_x, $cur_y); |
|
851 |
$gfx->vline($cur_y - $row_h); |
|
852 |
$gfx->fillcolor($border_color); |
|
853 |
} |
|
829 | 854 |
}#End of for(my $column_idx.... |
830 | 855 |
|
831 | 856 |
$cur_y -= $current_row_height; |
... | ... | |
846 | 871 |
{ |
847 | 872 |
$gfx->move( $xbase, $table_top_y); |
848 | 873 |
$gfx->vline( $cur_y ); |
849 |
my $cur_x = $xbase; |
|
850 |
for( my $j = 0; $j < $columns_number; $j++ ) |
|
851 |
{ |
|
852 |
$cur_x += $calc_column_widths->[$j]; |
|
853 |
$gfx->move( $cur_x, $table_top_y ); |
|
854 |
$gfx->vline( $cur_y ); |
|
855 |
} |
|
874 |
$gfx->move($xbase + sum(@{ $calc_column_widths }[0..$num_cols - 1]), $table_top_y); |
|
875 |
$gfx->vline( $cur_y ); |
|
856 | 876 |
} |
857 | 877 |
|
858 | 878 |
# ACTUALLY draw all the lines |
Auch abrufbar als: Unified diff
Unterstützung für zellenübergreifende Überschriften im PDF-Export des ReportGenerators verbessert.
Reimplementation von d3897394/35cd4452.