diff options
| author | Kevin Seidel <kevin@zahlz.com> | 2018-01-31 08:45:10 +0100 | 
|---|---|---|
| committer | Kevin Seidel <kevin@zahlz.com> | 2018-01-31 08:45:10 +0100 | 
| commit | f27fb86f5efd6e011db7bff1ddbdae87c31a8e48 (patch) | |
| tree | 6174fe31cac6a056fba94a8c9f49acb649042e80 | |
| parent | 93d1c15c05dd7d06f99dad920f11545a8a8654d0 (diff) | |
| parent | d65c2335e8ec3db6c87c9e23aa2ff329da57e182 (diff) | |
Merge branch 'master' of https://github.com/jung-kurt/gofpdf
| -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 +} | 
