Skip to content

Commit

Permalink
Merge branch 'master' of https://github.com/jung-kurt/gofpdf
Browse files Browse the repository at this point in the history
  • Loading branch information
moogle19 committed Jan 2, 2018
2 parents d0cda52 + c8debda commit 2424444
Show file tree
Hide file tree
Showing 7 changed files with 118 additions and 27 deletions.
4 changes: 1 addition & 3 deletions license.txt → LICENSE
Original file line number Diff line number Diff line change
@@ -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
Expand Down
64 changes: 56 additions & 8 deletions contrib/barcode/barcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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 {
Expand All @@ -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()
Expand Down Expand Up @@ -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
}
51 changes: 46 additions & 5 deletions contrib/barcode/barcode_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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)
Expand All @@ -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)
Expand All @@ -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
}
5 changes: 5 additions & 0 deletions def.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@ type gradientType struct {
objNum int
}

const (
OrientationPortrait = "portrait"
OrientationLandscape = "landscape"
)

type colorMode int

const (
Expand Down
15 changes: 8 additions & 7 deletions fpdf.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion fpdf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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!")
Expand Down
4 changes: 1 addition & 3 deletions template.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 2424444

Please sign in to comment.