X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=modules%2Foverride%2FPDF%2FTable.pm;h=5934fcb7001d6531e63a44a770e052964cf1f2c5;hb=f81dcf3479f34b5299491ea5df476ddf977379b9;hp=0316e2a48e0160ee27ac009316eadf21eae6dc6e;hpb=394141259dbdc2b36f480ab57bbc9bcf781d1607;p=kivitendo-erp.git diff --git a/modules/override/PDF/Table.pm b/modules/override/PDF/Table.pm index 0316e2a48..5934fcb70 100644 --- a/modules/override/PDF/Table.pm +++ b/modules/override/PDF/Table.pm @@ -129,8 +129,8 @@ sub text_block # Check if any text to display unless( defined( $text) and length($text) > 0 ) { - carp "Warning: No input text found. Trying to add dummy '-' and not to break everything.\n"; - $text = '-'; +# carp "Warning: No input text found. Trying to add dummy '-' and not to break everything.\n"; + $text = ' '; } # Strip any and Split the text into paragraphs @@ -206,8 +206,12 @@ sub text_block } # Lets take from paragraph as many words as we can put into $width - $indent; - while ( @paragraph and $text_object->advancewidth( join("\x20", @line)."\x20" . $paragraph[0]) + - $line_width < $width ) + # Always take at least one word; otherwise we'd end up in an infinite loop. + while ( !scalar(@line) || ( + @paragraph && ( + $text_object->advancewidth( join("\x20", @line)."\x20" . $paragraph[0]) + $line_width < $width + ) + )) { push(@line, shift(@paragraph)); } @@ -452,7 +456,7 @@ sub table for( my $row_idx = 0; $row_idx < scalar(@$data) ; $row_idx++ ) { - push @header_row_widths, [] if $row_idx < $header_props->{num_header_rows}; + #push @header_row_widths, [] if $row_idx < $header_props->{num_header_rows}; my $column_widths = []; #holds the width of each column # Init the height for this row @@ -487,8 +491,12 @@ sub table $rows_height->[$row_idx] = $cell_font_size; } + if (!defined $data->[$row_idx][$column_idx]) { + $data->[$row_idx][$column_idx] = ' '; + } + # This should fix a bug with very long words like serial numbers etc. - if( $max_word_len > 0 ) + if( $max_word_len > 0 && $data->[$row_idx][$column_idx]) { $data->[$row_idx][$column_idx] =~ s#(\S{$max_word_len})(?=\S)#$1 #g; } @@ -580,11 +588,9 @@ sub table if( ref $header_props and $header_props->{'repeat'}) { - for my $idx (0 .. $header_props->{num_header_rows} - 1) { - unshift @$data, [ @{ $header_rows[$idx] } ]; - unshift @$row_col_widths, [ @{ $header_row_widths[$idx] } ]; - unshift @$rows_height, $header_row_heights[$idx]; - } + unshift @$data, @header_rows; + unshift @$row_col_widths, @header_row_widths; + unshift @$rows_height, @header_row_heights; $remaining_header_rows = $header_props->{num_header_rows}; } } @@ -646,12 +652,12 @@ sub table # Added to resolve infite loop bug with returned undef values for(my $d = 0; $d < scalar(@{$record}) ; $d++) { - $record->[$d] = '-' unless( defined $record->[$d]); + $record->[$d] = ' ' unless( defined $record->[$d]); } # Choose colors for this row - $background_color = $row_index % 2 ? $background_color_even : $background_color_odd; - $font_color = $row_index % 2 ? $font_color_even : $font_color_odd; + $background_color = ($row_index - $header_props->{num_header_rows}) % 2 ? $background_color_even : $background_color_odd; + $font_color = ($row_index - $header_props->{num_header_rows}) % 2 ? $font_color_even : $font_color_odd; #Determine current row height my $current_row_height = $pad_top + $pre_calculated_row_height + $pad_bot; @@ -712,9 +718,9 @@ sub table $txt->fillcolor($cell_font_color); my $this_width; - if (!$remaining_header_rows && $cell_props->[$row_index][$column_idx]->{colspan}) { - $colspan = $cell_props->[$row_index][$column_idx]->{colspan}; - } elsif ($remaining_header_rows && $header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan}) { + if (!$remaining_header_rows && $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{colspan}) { + $colspan = $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{colspan}; + } elsif ($remaining_header_rows && ($header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan})) { $colspan = $header_row_cell_props[$header_props->{num_header_rows} - $remaining_header_rows][$column_idx]->{colspan}; } @@ -795,7 +801,7 @@ sub table } # Get the most specific value if none was already set from header_props - $cell_bg_color ||= $cell_props->[$row_index][$column_idx]->{'background_color'} + $cell_bg_color ||= $cell_props->[$row_index + $header_props->{num_header_rows}][$column_idx]->{'background_color'} || $col_props->[$column_idx]->{'background_color'} || $background_color; @@ -809,7 +815,7 @@ sub table if ($line_w && $vertical_lines[$column_idx] && ($column_idx != (scalar(@{ $record }) - 1))) { $gfx->move($cur_x, $cur_y); - $gfx->vline($cur_y - $row_h); + $gfx->vline($cur_y - $current_row_height); $gfx->fillcolor($border_color); } }#End of for(my $column_idx.... @@ -887,32 +893,11 @@ sub CalcColumnWidths $calc_widths->[$j] = $col_props->[$j]->{min_w} || 0;; } - # Allow columns to expand to max_w before applying extra space equally. - my $is_last_iter; - for (;;) - { - my $span = ($avail_width - $min_width) / scalar( @$col_props); - last if $span <= 0; - - $min_width = 0; - my $next_will_be_last_iter = 1; - for(my $j = 0; $j < scalar(@$col_props); $j++ ) - { - my $new_w = $calc_widths->[$j] + $span; - - if (!$is_last_iter && $new_w > $col_props->[$j]->{max_w}) - { - $new_w = $col_props->[$j]->{max_w} - } - if ($calc_widths->[$j] != $new_w ) - { - $calc_widths->[$j] = $new_w; - $next_will_be_last_iter = 0; - } - $min_width += $new_w; - } - last if $is_last_iter; - $is_last_iter = $next_will_be_last_iter; + my $span = 0; + # Calculate how much can be added to every column to fit the available width + $span = ($avail_width - $min_width) / scalar( @$col_props); + for (my $j = 0; $j < scalar(@$col_props); $j++ ) { + $calc_widths->[$j] = $col_props->[$j]->{min_w} + $span; } return ($calc_widths,$avail_width);