diff options
| author | Kevin Seidel <kevin@zahlz.com> | 2018-01-02 14:38:12 +0100 | 
|---|---|---|
| committer | Kevin Seidel <kevin@zahlz.com> | 2018-01-02 14:38:12 +0100 | 
| commit | 242444464510f0bf64b60f38f6f44e28d3da137f (patch) | |
| tree | ca6b27bdecbebe8a54cc3276f791ff2c95aa2da9 | |
| parent | d0cda52642506c515aed23ac7468831de11ad465 (diff) | |
| parent | c8debdafb5eeac8330420d4b1699cc1094237805 (diff) | |
Merge branch 'master' of https://github.com/jung-kurt/gofpdf
| -rw-r--r-- | LICENSE (renamed from license.txt) | 4 | ||||
| -rw-r--r-- | contrib/barcode/barcode.go | 64 | ||||
| -rw-r--r-- | contrib/barcode/barcode_test.go | 51 | ||||
| -rw-r--r-- | def.go | 5 | ||||
| -rw-r--r-- | fpdf.go | 15 | ||||
| -rw-r--r-- | fpdf_test.go | 2 | ||||
| -rw-r--r-- | template.go | 4 | 
7 files changed, 118 insertions, 27 deletions
| @@ -1,8 +1,6 @@  MIT License -Copyright (c) 2013-2016 Kurt Jung (Gmail: kurt.w.jung) - -Portions copyright by the contributors acknowledged in the documentation. +Copyright (c) 2017 Kurt Jung and contributors acknowledged in the documentation  Permission is hereby granted, free of charge, to any person obtaining a copy  of this software and associated documentation files (the "Software"), to deal diff --git a/contrib/barcode/barcode.go b/contrib/barcode/barcode.go index 9f8d3ff..26f99c3 100644 --- a/contrib/barcode/barcode.go +++ b/contrib/barcode/barcode.go @@ -56,12 +56,9 @@ type barcodePdf interface {  	SetError(err error)  } -// Barcode puts a registered barcode in the current page. -// -// The size should be specified in the units used to create the PDF document. -// -// Positioning with x, y and flow is inherited from Fpdf.Image(). -func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) { +// printBarcode internally prints the scaled or unscaled barcode to the PDF. Used by both +// Barcode() and BarcodeUnscalable(). +func printBarcode(pdf barcodePdf, code string, x, y float64, w, h *float64, flow bool) {  	barcodes.Lock()  	unscaled, ok := barcodes.cache[code]  	barcodes.Unlock() @@ -76,10 +73,18 @@ func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) {  	info := pdf.GetImageInfo(bname)  	if info == nil { +		scaleToWidth := unscaled.Bounds().Dx() +		scaleToHeight := unscaled.Bounds().Dy() +		if w != nil { +			scaleToWidth = int(convertTo96Dpi(pdf, *w)) +		} +		if h != nil { +			scaleToHeight = int(convertTo96Dpi(pdf, *h)) +		}  		bcode, err := barcode.Scale(  			unscaled, -			int(convertTo96Dpi(pdf, w)), -			int(convertTo96Dpi(pdf, h)), +			scaleToWidth, +			scaleToHeight,  		)  		if err != nil { @@ -95,6 +100,43 @@ func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) {  	}  	pdf.Image(bname, x, y, 0, 0, flow, "jpg", 0, "") + +} + +// BarcodeUnscalable puts a registered barcode in the current page. +// +// Its arguments work in the same way as that of Barcode(). However, it allows for an unscaled +// barcode in the width and/or height dimensions. This can be useful if you want to prevent +// side effects of upscaling. +func BarcodeUnscalable(pdf barcodePdf, code string, x, y float64, w, h *float64, flow bool) { +	printBarcode(pdf, code, x, y, w, h, flow) +} + +// Barcode puts a registered barcode in the current page. +// +// The size should be specified in the units used to create the PDF document. +// If width or height are left unspecfied, the barcode is not scaled in the unspecified dimensions. +// +// Positioning with x, y and flow is inherited from Fpdf.Image(). +func Barcode(pdf barcodePdf, code string, x, y, w, h float64, flow bool) { +	printBarcode(pdf, code, x, y, &w, &h, flow) +} + +// GetUnscaledBarcodeDimensions returns the width and height of the +// unscaled barcode associated with the given code. +func GetUnscaledBarcodeDimensions(pdf barcodePdf, code string) (w, h float64) { +	barcodes.Lock() +	unscaled, ok := barcodes.cache[code] +	barcodes.Unlock() + +	if !ok { +		err := errors.New("Barcode not found") +		pdf.SetError(err) +		return +	} + +	return convertFrom96Dpi(pdf, float64(unscaled.Bounds().Dx())), +		convertFrom96Dpi(pdf, float64(unscaled.Bounds().Dy()))  }  // Register registers a barcode but does not put it on the page. Use Barcode() @@ -248,3 +290,9 @@ func registerScaledBarcode(pdf barcodePdf, code string, bcode barcode.Barcode) e  func convertTo96Dpi(pdf barcodePdf, value float64) float64 {  	return value * pdf.GetConversionRatio() / 72 * 96  } + +// convertFrom96Dpi converts the given value, which is based on a 96 DPI value +// required for an Image, to a 72 DPI value like the rest of the PDF document. +func convertFrom96Dpi(pdf barcodePdf, value float64) float64 { +	return value / pdf.GetConversionRatio() * 72 / 96 +} diff --git a/contrib/barcode/barcode_test.go b/contrib/barcode/barcode_test.go index 5b6c8cf..0a40a09 100644 --- a/contrib/barcode/barcode_test.go +++ b/contrib/barcode/barcode_test.go @@ -27,7 +27,9 @@ func ExampleRegister() {  	if err == nil {  		key := barcode.Register(bcode) -		barcode.Barcode(pdf, key, 15, 15, 100, 10, false) +		var width float64 = 100 +		var height float64 = 10.0 +		barcode.BarcodeUnscalable(pdf, key, 15, 15, &width, &height, false)  	}  	err = pdf.OutputFileAndClose(fileStr) @@ -40,7 +42,9 @@ func ExampleRegisterCodabar() {  	pdf := createPdf()  	key := barcode.RegisterCode128(pdf, "codabar") -	barcode.Barcode(pdf, key, 15, 15, 100, 10, false) +	var width float64 = 100 +	var height float64 = 10 +	barcode.BarcodeUnscalable(pdf, key, 15, 15, &width, &height, false)  	fileStr := example.Filename("contrib_barcode_RegisterCodabar")  	err := pdf.OutputFileAndClose(fileStr) @@ -118,7 +122,7 @@ func ExampleRegisterQR() {  	pdf := createPdf()  	key := barcode.RegisterQR(pdf, "qrcode", qr.H, qr.Unicode) -	barcode.Barcode(pdf, key, 15, 15, 20, 20, false) +	barcode.Barcode(pdf, key, 15, 15, 100, 10, false)  	fileStr := example.Filename("contrib_barcode_RegisterQR")  	err := pdf.OutputFileAndClose(fileStr) @@ -131,7 +135,7 @@ func ExampleRegisterTwoOfFive() {  	pdf := createPdf()  	key := barcode.RegisterTwoOfFive(pdf, "1234567895", true) -	barcode.Barcode(pdf, key, 15, 15, 100, 20, false) +	barcode.Barcode(pdf, key, 15, 15, 100, 10, false)  	fileStr := example.Filename("contrib_barcode_RegisterTwoOfFive")  	err := pdf.OutputFileAndClose(fileStr) @@ -144,7 +148,7 @@ func ExampleRegisterPdf417() {  	pdf := createPdf()  	key := barcode.RegisterPdf417(pdf, "1234567895", 10, 5) -	barcode.Barcode(pdf, key, 15, 15, 100, 20, false) +	barcode.Barcode(pdf, key, 15, 15, 100, 10, false)  	fileStr := example.Filename("contrib_barcode_RegisterPdf417")  	err := pdf.OutputFileAndClose(fileStr) @@ -158,3 +162,40 @@ func TestRegisterCode128(t *testing.T) {  	pdf := createPdf()  	barcode.RegisterCode128(pdf, "Invalid character: é")  } + +// Shows that the barcode may be scaled or not by providing optional heights and widths. +func TestBarcodeUnscalable(t *testing.T) { +	pdf := createPdf() + +	key := barcode.RegisterCode128(pdf, "code128") +	var width float64 = 100 +	var height float64 = 10 +	barcode.BarcodeUnscalable(pdf, key, 15, 15, &width, &height, false) +	barcode.BarcodeUnscalable(pdf, key, 15, 35, nil, &height, false) +	barcode.BarcodeUnscalable(pdf, key, 15, 55, &width, nil, false) +	barcode.BarcodeUnscalable(pdf, key, 15, 75, nil, nil, false) + +	fileStr := example.Filename("contrib_barcode_Barcode") +	err := pdf.OutputFileAndClose(fileStr) +	example.Summary(err, fileStr) +	// Output: +	// Successfully generated ../../pdf/contrib_barcode_Barcode.pdf +} + +// Shows that the width and height returned by the function match that of the barcode +func TestGetUnscaledBarcodeDimensions(t *testing.T) { +	pdf := createPdf() + +	key := barcode.RegisterQR(pdf, "qrcode", qr.H, qr.Unicode) +	barcode.BarcodeUnscalable(pdf, key, 15, 15, nil, nil, false) +	w, h := barcode.GetUnscaledBarcodeDimensions(pdf, key) + +	pdf.SetDrawColor(255, 0, 0) +	pdf.Line(15, 15, 15+w, 15+h) + +	fileStr := example.Filename("contrib_barcode_GetBarcodeDimensions") +	err := pdf.OutputFileAndClose(fileStr) +	example.Summary(err, fileStr) +	// Output: +	// Successfully generated ../../pdf/contrib_barcode_GetBarcodeDimensions.pdf +} @@ -39,6 +39,11 @@ type gradientType struct {  	objNum            int  } +const ( +	OrientationPortrait  = "portrait" +	OrientationLandscape = "landscape" +) +  type colorMode int  const ( @@ -59,7 +59,9 @@ func (b *fmtBuffer) printf(fmtStr string, args ...interface{}) {  func fpdfNew(orientationStr, unitStr, sizeStr, fontDirStr string, size SizeType) (f *Fpdf) {  	f = new(Fpdf)  	if orientationStr == "" { -		orientationStr = "P" +		orientationStr = "p" +	} else { +		orientationStr = strings.ToLower(orientationStr)  	}  	if unitStr == "" {  		unitStr = "mm" @@ -143,7 +145,6 @@ func fpdfNew(orientationStr, unitStr, sizeStr, fontDirStr string, size SizeType)  	}  	f.curPageSize = f.defPageSize  	// Page orientation -	orientationStr = strings.ToLower(orientationStr)  	switch orientationStr {  	case "p", "portrait":  		f.defOrientation = "P" @@ -1931,19 +1932,19 @@ func (f *Fpdf) CellFormat(w, h float64, txtStr string, borderStr string, ln int,  	if len(txtStr) > 0 {  		var dx, dy float64  		// Horizontal alignment -		if strings.Index(alignStr, "R") != -1 { +		if strings.Contains(alignStr, "R") {  			dx = w - f.cMargin - f.GetStringWidth(txtStr) -		} else if strings.Index(alignStr, "C") != -1 { +		} else if strings.Contains(alignStr, "C") {  			dx = (w - f.GetStringWidth(txtStr)) / 2  		} else {  			dx = f.cMargin  		}  		// Vertical alignment -		if strings.Index(alignStr, "T") != -1 { +		if strings.Contains(alignStr, "T") {  			dy = (f.fontSize - h) / 2.0 -		} else if strings.Index(alignStr, "B") != -1 { +		} else if strings.Contains(alignStr, "B") {  			dy = (h - f.fontSize) / 2.0 -		} else if strings.Index(alignStr, "A") != -1 { +		} else if strings.Contains(alignStr, "A") {  			var descent float64  			d := f.currentFont.Desc  			if d.Descent == 0 { diff --git a/fpdf_test.go b/fpdf_test.go index 76ef558..ff41fd2 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -191,7 +191,7 @@ func lorem() string {  // finally retrieved with the output call where it can be handled by the  // application.  func Example() { -	pdf := gofpdf.New("P", "mm", "A4", "") +	pdf := gofpdf.New(gofpdf.OrientationPortrait, "mm", "A4", "")  	pdf.AddPage()  	pdf.SetFont("Arial", "B", 16)  	pdf.Cell(40, 10, "Hello World!") diff --git a/template.go b/template.go index 1826fd7..60b076b 100644 --- a/template.go +++ b/template.go @@ -254,9 +254,7 @@ func templateChainDependencies(template Template) []Template {  	requires := template.Templates()  	chain := make([]Template, len(requires)*2)  	for _, req := range requires { -		for _, sub := range templateChainDependencies(req) { -			chain = append(chain, sub) -		} +		chain = append(chain, templateChainDependencies(req)...)  	}  	chain = append(chain, template)  	return chain | 
