From 4491d0fe5997270270f8e4023786afd99251f604 Mon Sep 17 00:00:00 2001 From: Kurt Date: Fri, 25 Aug 2017 16:51:57 -0400 Subject: Demonstrate word-wrapping in table cells --- fpdf_test.go | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/fpdf_test.go b/fpdf_test.go index 9b45486..db46528 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -164,13 +164,21 @@ func strDelimit(str string, sepstr string, sepcount int) string { return str } +func loremList() []string { + return []string{ + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod " + + "tempor incididunt ut labore et dolore magna aliqua.", + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " + + "aliquip ex ea commodo consequat.", + "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum " + + "dolore eu fugiat nulla pariatur.", + "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui " + + "officia deserunt mollit anim id est laborum.", + } +} + func lorem() string { - return "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod " + - "tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis " + - "nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis " + - "aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat " + - "nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui " + - "officia deserunt mollit anim id est laborum." + return strings.Join(loremList(), " ") } // This example demonstrates the generation of a simple PDF document. Note that @@ -407,6 +415,87 @@ func ExampleFpdf_SetLeftMargin() { // Successfully generated pdf/Fpdf_SetLeftMargin_multicolumn.pdf } +// This example demonstrates word-wrapped table cells +func ExampleFpdf_SplitLines_tables() { + const ( + colCount = 3 + colWd = 60.0 + marginH = 15.0 + lineHt = 5.5 + cellGap = 2.0 + ) + // var colStrList [colCount]string + type cellType struct { + str string + list [][]byte + ht float64 + } + var ( + cellList [colCount]cellType + cell cellType + ) + + pdf := gofpdf.New("P", "mm", "A4", "") // 210 x 297 + header := [colCount]string{"Column A", "Column B", "Column C"} + alignList := [colCount]string{"L", "C", "R"} + strList := loremList() + pdf.SetMargins(marginH, 15, marginH) + pdf.SetFont("Arial", "", 14) + pdf.AddPage() + + // Headers + pdf.SetTextColor(224, 224, 224) + pdf.SetFillColor(64, 64, 64) + for colJ := 0; colJ < colCount; colJ++ { + pdf.CellFormat(colWd, 10, header[colJ], "1", 0, "CM", true, 0, "") + } + pdf.Ln(-1) + pdf.SetTextColor(24, 24, 24) + pdf.SetFillColor(255, 255, 255) + + // Rows + y := pdf.GetY() + count := 0 + for rowJ := 0; rowJ < 2; rowJ++ { + maxHt := lineHt + // Cell height calculation loop + for colJ := 0; colJ < colCount; colJ++ { + count++ + if count > len(strList) { + count = 1 + } + cell.str = strings.Join(strList[0:count], " ") + cell.list = pdf.SplitLines([]byte(cell.str), colWd-cellGap-cellGap) + cell.ht = float64(len(cell.list)) * lineHt + if cell.ht > maxHt { + maxHt = cell.ht + } + cellList[colJ] = cell + } + // Cell render loop + x := marginH + for colJ := 0; colJ < colCount; colJ++ { + pdf.Rect(x, y, colWd, maxHt+cellGap+cellGap, "D") + cell = cellList[colJ] + cellY := y + cellGap + (maxHt-cell.ht)/2 + for splitJ := 0; splitJ < len(cell.list); splitJ++ { + pdf.SetXY(x+cellGap, cellY) + pdf.CellFormat(colWd-cellGap-cellGap, lineHt, string(cell.list[splitJ]), "", 0, + alignList[colJ], false, 0, "") + cellY += lineHt + } + x += colWd + } + y += maxHt + cellGap + cellGap + } + + fileStr := example.Filename("Fpdf_SplitLines_tables") + err := pdf.OutputFileAndClose(fileStr) + example.Summary(err, fileStr) + // Output: + // Successfully generated pdf/Fpdf_SplitLines_tables.pdf +} + // This example demonstrates various table styles. func ExampleFpdf_CellFormat_tables() { pdf := gofpdf.New("P", "mm", "A4", "") -- cgit v1.2.1-24-ge1ad