Bug 31259: Escape infinite loop when lime cannot wrap enough
It seems the wrapping here works with words, not characters. If a line is too long,
or too far over, we can't trim it enough. We need to escape if successive loops are
not changing the line
To test:
1 - Using sample data, edit the layout to match picture in comment 9
2 - Add some borrowers to a batch
3 - Attempt to export batch and save PDF
4 - Staff client waits
5 - ps aux | grep card
6 - Note the job keeps running
7 - Kill it
8 - Apply patch
9 - Restart_all
10 - Export batch again
11 - Success, you get a badly formatted PDF, rather than nothing
12 - Note the PDF does not show "Yakama Nation Library"
13 - Edit layout, male "Lower left X" 20 instead of 220
14 - Export again and note text field 1 shows correctly
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
(cherry picked from commit a18f65cdcc
)
Signed-off-by: Jacob O'Mara <jacobomara901@gmail.com>
This commit is contained in:
parent
425345440e
commit
f1010ee062
1 changed files with 7 additions and 0 deletions
|
@ -260,6 +260,7 @@ sub draw_text {
|
|||
# my $string_width = ($font_units_width * $text_attribs->{'font_size'}) / $units_per_em;
|
||||
my $string_width = C4::Creators::PDF->StrWidth($line, $text_attribs->{'font'}, $text_attribs->{'font_size'});
|
||||
if (($string_width + $text_attribs->{'llx'}) > $self->{'width'}) {
|
||||
my $cur_line = "";
|
||||
WRAP_LINES:
|
||||
while (1) {
|
||||
# $line =~ m/^.*(\s\b.*\b\s*|\s&|\<\b.*\b\>)$/; # original regexp... can be removed after dev stage is over
|
||||
|
@ -287,6 +288,12 @@ sub draw_text {
|
|||
push @lines, {line=> $line, Tx => $Tx, Ty => $Ty, Tw => $Tw};
|
||||
last WRAP_LINES;
|
||||
}
|
||||
} else {
|
||||
# We only split lines on spaces - it seems if we push a line too far, it can end
|
||||
# never getting short enough in which case we need to escape and the malformed PDF
|
||||
# will indicate the layout problem
|
||||
last WRAP_LINES if $cur_line eq $line;
|
||||
$cur_line = $line;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue