From 76dbd3f09366910f918201e7efb42b9da1aaffe4 Mon Sep 17 00:00:00 2001 From: Wilk Date: Fri, 16 Nov 2018 12:21:38 +0100 Subject: Make SplitLines and MultiCell split at the same place (#210) * Make SplitLines and MultiCell split at the same place * Use integer math for SplitLines and MultiCell --- fpdf.go | 10 +++++----- fpdf_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/fpdf.go b/fpdf.go index 1e324b1..fbe980b 100644 --- a/fpdf.go +++ b/fpdf.go @@ -2180,7 +2180,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill if w == 0 { w = f.w - f.rMargin - f.x } - wmax := (w - 2*f.cMargin) * 1000 / f.fontSize + wmax := int(math.Ceil((w - 2*f.cMargin) * 1000 / f.fontSize)) s := strings.Replace(txtStr, "\r", "", -1) nb := len(s) // if nb > 0 && s[nb-1:nb] == "\n" { @@ -2214,8 +2214,8 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill sep := -1 i := 0 j := 0 - l := 0.0 - ls := 0.0 + l := 0 + ls := 0 ns := 0 nl := 1 for i < nb { @@ -2244,7 +2244,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill ls = l ns++ } - l += float64(cw[c]) + l += cw[c] if l > wmax { // Automatic line break if sep == -1 { @@ -2259,7 +2259,7 @@ func (f *Fpdf) MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill } else { if alignStr == "J" { if ns > 1 { - f.ws = (wmax - ls) / 1000 * f.fontSize / float64(ns-1) + f.ws = float64((wmax-ls)/1000) * f.fontSize / float64(ns-1) } else { f.ws = 0 } diff --git a/fpdf_test.go b/fpdf_test.go index 89c90b6..8f1f700 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -100,6 +100,44 @@ func TestIssue0193(t *testing.T) { } +// TestIssue0209 addresses issue 209 +// make SplitLines and MultiCell split at the same place +func TestIssue0209SplitLinesEqualMultiCell(t *testing.T) { + var pdf *gofpdf.Fpdf + + pdf = gofpdf.New("P", "mm", "A4", "") + pdf.AddPage() + pdf.SetFont("Arial", "", 8) + // this sentence should not be splited + str := "Guochin Amandine" + lines := pdf.SplitLines([]byte(str), 26) + _, FontSize := pdf.GetFontSize() + y_start := pdf.GetY() + pdf.MultiCell(26, FontSize, str, "", "L", false) + y_end := pdf.GetY() + + if len(lines) != 1 { + t.Fatalf("expect SplitLines split in one line") + } + if int(y_end-y_start) != int(FontSize) { + t.Fatalf("expect MultiCell split in one line %.2f != %.2f", y_end-y_start, FontSize) + } + + // this sentence should be splited in two lines + str = "Guiochini Amandine" + lines = pdf.SplitLines([]byte(str), 26) + y_start = pdf.GetY() + pdf.MultiCell(26, FontSize, str, "", "L", false) + y_end = pdf.GetY() + + if len(lines) != 2 { + t.Fatalf("expect SplitLines split in two lines") + } + if int(y_end-y_start) != int(FontSize*2) { + t.Fatalf("expect MultiCell split in two lines %.2f != %.2f", y_end-y_start, FontSize*2) + } +} + // Test to make sure the footer is not call twice and SetFooterFuncLpi can work // without SetFooterFunc. func TestFooterFuncLpi(t *testing.T) { -- cgit v1.2.1-24-ge1ad