summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKurt <kurt.w.jung@gmail.com>2017-07-19 08:58:23 -0400
committerKurt <kurt.w.jung@gmail.com>2017-07-19 08:58:23 -0400
commit89020dfd155e80592495a7bbc37f6e5e713c0389 (patch)
tree0c5bb80595a5fd7936eddb6af939c7f3834ff279
parent1ea782459766b89293454ef7824f1bb5b071c4a1 (diff)
parent784ad190acab08c54aa4847f15207d5fa9c25ef0 (diff)
Merge branch 'aloidev-LastPageIndicator'
-rw-r--r--def.go1
-rw-r--r--fpdf.go34
-rw-r--r--fpdf_test.go63
3 files changed, 92 insertions, 6 deletions
diff --git a/def.go b/def.go
index c80eb37..552415f 100644
--- a/def.go
+++ b/def.go
@@ -221,6 +221,7 @@ type Fpdf struct {
headerFnc func() // function provided by app and called to write header
inFooter bool // flag set when processing footer
footerFnc func() // function provided by app and called to write footer
+ footerFncLpi func(bool) // function provided by app and called to write footer with last page flag
zoomMode string // zoom display mode
layoutMode string // layout display mode
title string // title
diff --git a/fpdf.go b/fpdf.go
index 9587e55..a8656dd 100644
--- a/fpdf.go
+++ b/fpdf.go
@@ -363,11 +363,27 @@ func (f *Fpdf) SetHeaderFunc(fnc func()) {
// Close() and should not be called directly by the application. The
// implementation in Fpdf is empty, so you have to provide an appropriate
// function if you want page footers. fnc will typically be a closure that has
-// access to the Fpdf instance and other document generation variables.
+// access to the Fpdf instance and other document generation variables. See
+// SetFooterFuncLpi for a similar function that passes a last page indicator.
//
// This method is demonstrated in the example for AddPage().
func (f *Fpdf) SetFooterFunc(fnc func()) {
f.footerFnc = fnc
+ f.footerFncLpi = nil
+}
+
+// SetFooterFuncLpi sets the function that lets the application render the page
+// footer. The specified function is automatically called by AddPage() and
+// Close() and should not be called directly by the application. It is passed a
+// boolean that is true if the last page of the document is being rendered. The
+// implementation in Fpdf is empty, so you have to provide an appropriate
+// function if you want page footers. fnc will typically be a closure that has
+// access to the Fpdf instance and other document generation variables.
+//
+// This method is demonstrated in the example for AddPage().
+func (f *Fpdf) SetFooterFuncLpi(fnc func(lastPage bool)) {
+ f.footerFncLpi = fnc
+ f.footerFnc = nil
}
// SetTopMargin defines the top margin. The method can be called before
@@ -538,11 +554,14 @@ func (f *Fpdf) Close() {
}
}
// Page footer
+ f.inFooter = true
if f.footerFnc != nil {
- f.inFooter = true
f.footerFnc()
- f.inFooter = false
+ } else if f.footerFncLpi != nil {
+ f.footerFncLpi(true)
}
+ f.inFooter = false
+
// Close page
f.endpage()
// Close document
@@ -592,12 +611,15 @@ func (f *Fpdf) AddPageFormat(orientationStr string, size SizeType) {
tc := f.color.text
cf := f.colorFlag
if f.page > 0 {
- // Page footer
+ f.inFooter = true
+ // Page footer avoid double call on footer.
if f.footerFnc != nil {
- f.inFooter = true
f.footerFnc()
- f.inFooter = false
+
+ } else if f.footerFncLpi != nil {
+ f.footerFncLpi(false) // not last page.
}
+ f.inFooter = false
// Close page
f.endpage()
}
diff --git a/fpdf_test.go b/fpdf_test.go
index 7da45aa..9b45486 100644
--- a/fpdf_test.go
+++ b/fpdf_test.go
@@ -75,7 +75,70 @@ func TestIssue0116(t *testing.T) {
if pdf.Error() == nil {
t.Fatalf("expecting error when rendering text without having set font")
}
+}
+
+// Test to make sure the footer is not call twice and SetFooterFuncLpi can work
+// without SetFooterFunc.
+func TestFooterFuncLpi(t *testing.T) {
+ pdf := gofpdf.New("P", "mm", "A4", "")
+ var (
+ oldFooterFnc = "oldFooterFnc"
+ bothPages = "bothPages"
+ firstPageOnly = "firstPageOnly"
+ lastPageOnly = "lastPageOnly"
+ )
+ // This set just for testing, only set SetFooterFuncLpi.
+ pdf.SetFooterFunc(func() {
+ pdf.SetY(-15)
+ pdf.SetFont("Arial", "I", 8)
+ pdf.CellFormat(0, 10, oldFooterFnc,
+ "", 0, "C", false, 0, "")
+ })
+ pdf.SetFooterFuncLpi(func(lastPage bool) {
+ pdf.SetY(-15)
+ pdf.SetFont("Arial", "I", 8)
+ pdf.CellFormat(0, 10, bothPages, "", 0, "L", false, 0, "")
+ if !lastPage {
+ pdf.CellFormat(0, 10, firstPageOnly, "", 0, "C", false, 0, "")
+ } else {
+ pdf.CellFormat(0, 10, lastPageOnly, "", 0, "C", false, 0, "")
+ }
+ })
+ pdf.AddPage()
+ pdf.SetFont("Arial", "B", 16)
+ for j := 1; j <= 40; j++ {
+ pdf.CellFormat(0, 10, fmt.Sprintf("Printing line number %d", j),
+ "", 1, "", false, 0, "")
+ }
+ if pdf.Error() != nil {
+ t.Fatalf("not expecting error when rendering text")
+ }
+ w := &bytes.Buffer{}
+ if err := pdf.Output(w); err != nil {
+ t.Errorf("unexpected err: %s", err)
+ }
+ b := w.Bytes()
+ if bytes.Contains(b, []byte(oldFooterFnc)) {
+ t.Errorf("not expecting %s render on pdf when FooterFncLpi is set", oldFooterFnc)
+ }
+ got := bytes.Count(b, []byte("bothPages"))
+ if got != 2 {
+ t.Errorf("footer %s should render on two page got:%d", bothPages, got)
+ }
+ got = bytes.Count(b, []byte(firstPageOnly))
+ if got != 1 {
+ t.Errorf("footer %s should render only on first page got: %d", firstPageOnly, got)
+ }
+ got = bytes.Count(b, []byte(lastPageOnly))
+ if got != 1 {
+ t.Errorf("footer %s should render only on first page got: %d", lastPageOnly, got)
+ }
+ f := bytes.Index(b, []byte(firstPageOnly))
+ l := bytes.Index(b, []byte(lastPageOnly))
+ if f > l {
+ t.Errorf("index %d (%s) should less than index %d (%s)", f, firstPageOnly, l, lastPageOnly)
+ }
}
type fontResourceType struct {