diff options
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | def.go | 6 | ||||
-rw-r--r-- | doc.go | 6 | ||||
-rw-r--r-- | fpdf.go | 32 | ||||
-rw-r--r-- | fpdf_test.go | 31 |
5 files changed, 67 insertions, 14 deletions
@@ -217,8 +217,10 @@ basic HTML functionality with aligned text. Kent Quirk implemented backwards-compatible support for reading DPI from images that support it, and for setting DPI manually and then having it properly taken into account when calculating image size. Paulo Coutinho provided support for static embedded -fonts. Dan Meyers added support for embedded JavaScript. Bruno Michel has -provided valuable assistance with the code. +fonts. Dan Meyers added support for embedded JavaScript. David Fish added a +generic alias-replacement function to enable, among other things, Table of +Contents functionality. Bruno Michel has provided valuable assistance with the +code. ## Roadmap @@ -40,7 +40,10 @@ type gradientType struct { } const ( - OrientationPortrait = "portrait" + // OrientationPortrait represents the portrait orientation. + OrientationPortrait = "portrait" + + // OrientationLandscape represents the landscape orientation. OrientationLandscape = "landscape" ) @@ -243,6 +246,7 @@ type Fpdf struct { fontSize float64 // current font size in user unit ws float64 // word spacing images map[string]*ImageInfoType // array of used images + aliasMap map[string]string // map of alias->replacement pageLinks [][]linkType // pageLinks[page][link], both 1-based links []intLinkType // array of internal links outlines []outlineType // array of outlines @@ -230,8 +230,10 @@ basic HTML functionality with aligned text. Kent Quirk implemented backwards-compatible support for reading DPI from images that support it, and for setting DPI manually and then having it properly taken into account when calculating image size. Paulo Coutinho provided support for static embedded -fonts. Dan Meyers added support for embedded JavaScript. Bruno Michel has -provided valuable assistance with the code. +fonts. Dan Meyers added support for embedded JavaScript. David Fish added a +generic alias-replacement function to enable, among other things, Table of +Contents functionality. Bruno Michel has provided valuable assistance with the +code. Roadmap @@ -88,6 +88,7 @@ func fpdfNew(orientationStr, unitStr, sizeStr, fontDirStr string, size SizeType) f.pageLinks = append(f.pageLinks, make([]linkType, 0, 0)) // pageLinks[0] is unused (1-based) f.links = make([]intLinkType, 0, 8) f.links = append(f.links, intLinkType{}) // links[0] is unused (1-based) + f.aliasMap = make(map[string]string) f.inHeader = false f.inFooter = false f.lasth = 0 @@ -3071,6 +3072,26 @@ func (f *Fpdf) SetJavascript(script string) { f.javascript = &script } +// RegisterAlias adds an (alias, replacement) pair to the document so we can +// replace all occurrences of that alias after writing but before the +// document is closed. +func (f *Fpdf) RegisterAlias(alias, replacement string) { + f.aliasMap[alias] = replacement +} + +func (f *Fpdf) replaceAliases() { + for alias, replacement := range f.aliasMap { + for n := 1; n <= f.page; n++ { + s := f.pages[n].String() + if strings.Contains(s, alias) { + s = strings.Replace(s, alias, replacement, -1) + f.pages[n].Truncate(0) + f.pages[n].WriteString(s) + } + } + } +} + func (f *Fpdf) putpages() { var wPt, hPt float64 var pageSize SizeType @@ -3079,16 +3100,9 @@ func (f *Fpdf) putpages() { nb := f.page if len(f.aliasNbPagesStr) > 0 { // Replace number of pages - nbStr := sprintf("%d", nb) - for n := 1; n <= nb; n++ { - s := f.pages[n].String() - if strings.Contains(s, f.aliasNbPagesStr) { - s = strings.Replace(s, f.aliasNbPagesStr, nbStr, -1) - f.pages[n].Truncate(0) - f.pages[n].WriteString(s) - } - } + f.RegisterAlias(f.aliasNbPagesStr, sprintf("%d", nb)) } + f.replaceAliases() if f.defOrientation == "P" { wPt = f.defPageSize.Wd * f.k hPt = f.defPageSize.Ht * f.k diff --git a/fpdf_test.go b/fpdf_test.go index ff41fd2..c7cd582 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -2060,3 +2060,34 @@ func ExampleFpdf_AddSpotColor() { // Output: // Successfully generated pdf/Fpdf_AddSpotColor.pdf } + +// This example demonstrates how to use `RegisterAlias` to create a table of +// contents. +func ExampleFpdf_RegisterAlias() { + pdf := gofpdf.New("P", "mm", "A4", "") + pdf.SetFont("Arial", "", 12) + pdf.AddPage() + + // Write the table of contents. We use aliases instead of the page number + // because we don't know which page the section will begin on. + numSections := 3 + for i := 1; i <= numSections; i++ { + pdf.Cell(0, 10, fmt.Sprintf("Section %d begins on page {%d}", i, i)) + pdf.Ln(10) + } + + // Write the sections. Before we start writing, we use `RegisterAlias` to + // ensure that the alias written in the table of contents will be replaced + // by the current page number. + for i := 1; i <= numSections; i++ { + pdf.AddPage() + pdf.RegisterAlias(fmt.Sprintf("{%d}", i), fmt.Sprintf("%d", pdf.PageNo())) + pdf.Write(10, fmt.Sprintf("Section %d", i)) + } + + fileStr := example.Filename("Fpdf_RegisterAlias") + err := pdf.OutputFileAndClose(fileStr) + example.Summary(err, fileStr) + // Output: + // Successfully generated pdf/Fpdf_RegisterAlias.pdf +} |