summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md12
-rw-r--r--doc.go12
-rw-r--r--fpdf_test.go252
-rw-r--r--internal/example/example.go104
-rw-r--r--internal/example/example_test.go31
-rw-r--r--ttfparser_test.go9
6 files changed, 265 insertions, 155 deletions
diff --git a/README.md b/README.md
index afe108f..4feb48a 100644
--- a/README.md
+++ b/README.md
@@ -93,8 +93,9 @@ rather than PHP.
##Example PDFs
-A side effect of running "go test" is the production of a number of example
-PDFs. These can be found in the gofpdf/pdf directory after the tests complete.
+A side effect of running "go test ./..." is the production of a number of
+example PDFs. These can be found in the gofpdf/pdf directory after the tests
+complete.
Please note that these examples run in the context of a test. In order run an
example as a standalone application, you'll need to examine [fpdf_test.go](https://github.com/jung-kurt/gofpdf/blob/master/fpdf_test.go) for
@@ -135,8 +136,11 @@ gofpdf for its document production mode.
gofpdf is a global community effort and you are invited to make it even better.
If you have implemented a new feature or corrected a problem, please consider
-contributing your change to the project. Here are guidelines for making
-submissions. Your change should
+contributing your change to the project. Contributions that do not directly
+pertain to the core functionality of gofpdf should be placed in their own
+directory directly beneath the `contrib` directory.
+
+Here are guidelines for making submissions. Your change should
* be compatible with the MIT License
* be properly documented
diff --git a/doc.go b/doc.go
index 6f1cec7..4c43de0 100644
--- a/doc.go
+++ b/doc.go
@@ -112,8 +112,9 @@ rather than PHP.
Example PDFs
-A side effect of running "go test" is the production of a number of example
-PDFs. These can be found in the gofpdf/pdf directory after the tests complete.
+A side effect of running "go test ./..." is the production of a number of
+example PDFs. These can be found in the gofpdf/pdf directory after the tests
+complete.
Please note that these examples run in the context of a test. In order run an
example as a standalone application, you'll need to examine fpdf_test.go for
@@ -149,8 +150,11 @@ Contributing Changes
gofpdf is a global community effort and you are invited to make it even better.
If you have implemented a new feature or corrected a problem, please consider
-contributing your change to the project. Here are guidelines for making
-submissions. Your change should
+contributing your change to the project. Contributions that do not directly
+pertain to the core functionality of gofpdf should be placed in their own
+directory directly beneath the `contrib` directory.
+
+Here are guidelines for making submissions. Your change should
• be compatible with the MIT License
diff --git a/fpdf_test.go b/fpdf_test.go
index 71aa0d2..0af3556 100644
--- a/fpdf_test.go
+++ b/fpdf_test.go
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2014 Kurt Jung (Gmail: kurt.w.jung)
+ * Copyright (c) 2013-2015 Kurt Jung (Gmail: kurt.w.jung)
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -30,15 +30,7 @@ import (
"strings"
"github.com/jung-kurt/gofpdf"
-)
-
-// Absolute path needed for gocov tool; relative OK for test
-const (
- cnGofpdfDir = "."
- cnFontDir = cnGofpdfDir + "/font"
- cnImgDir = cnGofpdfDir + "/image"
- cnTextDir = cnGofpdfDir + "/text"
- cnExampleDir = cnGofpdfDir + "/pdf"
+ "github.com/jung-kurt/gofpdf/internal/example"
)
func init() {
@@ -46,37 +38,23 @@ func init() {
}
func cleanup() {
- filepath.Walk(cnExampleDir,
+ filepath.Walk(example.PdfDir(),
func(path string, info os.FileInfo, err error) (reterr error) {
- if path[len(path)-4:] == ".pdf" {
- os.Remove(path)
+ if len(path) > 3 {
+ if path[len(path)-4:] == ".pdf" {
+ os.Remove(path)
+ }
}
return
})
}
-func imageFile(fileStr string) string {
- return filepath.Join(cnImgDir, fileStr)
-}
-
-func fontFile(fileStr string) string {
- return filepath.Join(cnFontDir, fileStr)
-}
-
-func textFile(fileStr string) string {
- return filepath.Join(cnTextDir, fileStr)
-}
-
-func exampleFile(fileStr string) string {
- return filepath.Join(cnExampleDir, fileStr)
-}
-
type fontResourceType struct {
}
func (f fontResourceType) Open(name string) (rdr io.Reader, err error) {
var buf []byte
- buf, err = ioutil.ReadFile(fontFile(name))
+ buf, err = ioutil.ReadFile(example.FontFile(name))
if err == nil {
rdr = bytes.NewReader(buf)
fmt.Printf("Generalized font loader reading %s\n", name)
@@ -103,35 +81,23 @@ func lorem() string {
"officia deserunt mollit anim id est laborum."
}
-func exampleFilename(baseStr string) string {
- return filepath.Join(cnExampleDir, baseStr+".pdf")
-}
-
-func summary(err error, fileStr string) {
- if err == nil {
- fileStr = filepath.ToSlash(fileStr)
- fmt.Printf("Successfully generated %s\n", fileStr)
- } else {
- fmt.Println(err)
- }
-}
-
// This example demonstrates the generation of a simple PDF document. Note that
// since only core fonts are used (in this case Arial, a synonym for
// Helvetica), an empty string can be specified for the font directory in the
-// call to New(). Note also that the exampleFilename and summary functions are
-// local to the test file and are not part of the gofpdf library. If an error
-// occurs at some point during the construction of the document, subsequent
-// method calls exit immediately and the error is finally retreived with the
-// output call where it can be handled by the application.
+// call to New(). Note also that the example.Filename() and example.Summary()
+// functions belong to a separate, internal package and are not part of the
+// gofpdf library. If an error occurs at some point during the construction of
+// the document, subsequent method calls exit immediately and the error is
+// finally retreived with the output call where it can be handled by the
+// application.
func Example() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "B", 16)
pdf.Cell(40, 10, "Hello World!")
- fileStr := exampleFilename("basic")
+ fileStr := example.Filename("basic")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/basic.pdf
}
@@ -140,7 +106,7 @@ func Example() {
func ExampleFpdf_AddPage() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.SetHeaderFunc(func() {
- pdf.Image(imageFile("logo.png"), 10, 6, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo.png"), 10, 6, 30, 0, false, "", 0, "")
pdf.SetY(5)
pdf.SetFont("Arial", "B", 15)
pdf.Cell(80, 0, "")
@@ -160,9 +126,9 @@ func ExampleFpdf_AddPage() {
pdf.CellFormat(0, 10, fmt.Sprintf("Printing line number %d", j),
"", 1, "", false, 0, "")
}
- fileStr := exampleFilename("Fpdf_AddPage")
+ fileStr := example.Filename("Fpdf_AddPage")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_AddPage.pdf
}
@@ -234,11 +200,11 @@ func ExampleFpdf_MultiCell() {
chapterTitle(chapNum, titleStr)
chapterBody(fileStr)
}
- printChapter(1, "A RUNAWAY REEF", textFile("20k_c1.txt"))
- printChapter(2, "THE PROS AND CONS", textFile("20k_c2.txt"))
- fileStr := exampleFilename("Fpdf_MultiCell")
+ printChapter(1, "A RUNAWAY REEF", example.TextFile("20k_c1.txt"))
+ printChapter(2, "THE PROS AND CONS", example.TextFile("20k_c2.txt"))
+ fileStr := example.Filename("Fpdf_MultiCell")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_MultiCell.pdf
}
@@ -340,11 +306,11 @@ func ExampleFpdf_SetLeftMargin() {
pdf.CellFormat(0, 10, fmt.Sprintf("Page %d", pdf.PageNo()),
"", 0, "C", false, 0, "")
})
- printChapter(1, "A RUNAWAY REEF", textFile("20k_c1.txt"))
- printChapter(2, "THE PROS AND CONS", textFile("20k_c2.txt"))
- fileStr := exampleFilename("Fpdf_SetLeftMargin_multicolumn")
+ printChapter(1, "A RUNAWAY REEF", example.TextFile("20k_c1.txt"))
+ printChapter(2, "THE PROS AND CONS", example.TextFile("20k_c2.txt"))
+ fileStr := example.Filename("Fpdf_SetLeftMargin_multicolumn")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetLeftMargin_multicolumn.pdf
}
@@ -460,7 +426,7 @@ func ExampleFpdf_CellFormat_1() {
}
pdf.CellFormat(wSum, 0, "", "T", 0, "", false, 0, "")
}
- loadData(textFile("countries.txt"))
+ loadData(example.TextFile("countries.txt"))
pdf.SetFont("Arial", "", 14)
pdf.AddPage()
basicTable()
@@ -468,9 +434,9 @@ func ExampleFpdf_CellFormat_1() {
improvedTable()
pdf.AddPage()
fancyTable()
- fileStr := exampleFilename("Fpdf_CellFormat_1_tables")
+ fileStr := example.Filename("Fpdf_CellFormat_1_tables")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_CellFormat_1_tables.pdf
}
@@ -491,7 +457,7 @@ func ExampleFpdf_HTMLBasicNew() {
// Second page: image link and basic HTML with link
pdf.AddPage()
pdf.SetLink(link, 0, -1)
- pdf.Image(imageFile("logo.png"), 10, 12, 30, 0, false, "", 0, "http://www.fpdf.org")
+ pdf.Image(example.ImageFile("logo.png"), 10, 12, 30, 0, false, "", 0, "http://www.fpdf.org")
pdf.SetLeftMargin(45)
pdf.SetFontSize(14)
_, lineHt = pdf.GetFontSize()
@@ -501,23 +467,23 @@ func ExampleFpdf_HTMLBasicNew() {
`<a href="http://www.fpdf.org">www.fpdf.org</a>, or on an image: click on the logo.`
html := pdf.HTMLBasicNew()
html.Write(lineHt, htmlStr)
- fileStr := exampleFilename("Fpdf_HTMLBasicNew")
+ fileStr := example.Filename("Fpdf_HTMLBasicNew")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_HTMLBasicNew.pdf
}
// This example demonstrates the use of a non-standard font.
func ExampleFpdf_AddFont() {
- pdf := gofpdf.New("P", "mm", "A4", cnFontDir)
+ pdf := gofpdf.New("P", "mm", "A4", example.FontDir())
pdf.AddFont("Calligrapher", "", "calligra.json")
pdf.AddPage()
pdf.SetFont("Calligrapher", "", 35)
pdf.Cell(0, 10, "Enjoy new fonts with FPDF!")
- fileStr := exampleFilename("Fpdf_AddFont")
+ fileStr := example.Filename("Fpdf_AddFont")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_AddFont.pdf
}
@@ -527,19 +493,19 @@ func ExampleFpdf_Image() {
pdf := gofpdf.New("P", "mm", "A4", "")
pdf.AddPage()
pdf.SetFont("Arial", "", 11)
- pdf.Image(imageFile("logo.png"), 10, 10, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo.png"), 10, 10, 30, 0, false, "", 0, "")
pdf.Text(50, 20, "logo.png")
- pdf.Image(imageFile("logo.gif"), 10, 40, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo.gif"), 10, 40, 30, 0, false, "", 0, "")
pdf.Text(50, 50, "logo.gif")
- pdf.Image(imageFile("logo-gray.png"), 10, 70, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo-gray.png"), 10, 70, 30, 0, false, "", 0, "")
pdf.Text(50, 80, "logo-gray.png")
- pdf.Image(imageFile("logo-rgb.png"), 10, 100, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo-rgb.png"), 10, 100, 30, 0, false, "", 0, "")
pdf.Text(50, 110, "logo-rgb.png")
- pdf.Image(imageFile("logo.jpg"), 10, 130, 30, 0, false, "", 0, "")
+ pdf.Image(example.ImageFile("logo.jpg"), 10, 130, 30, 0, false, "", 0, "")
pdf.Text(50, 140, "logo.jpg")
- fileStr := exampleFilename("Fpdf_Image")
+ fileStr := example.Filename("Fpdf_Image")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Image.pdf
}
@@ -589,17 +555,17 @@ func ExampleFpdf_SetAcceptPageBreakFunc() {
pdf.SetFont("Times", "", 12)
for j := 0; j < 20; j++ {
if j == 1 {
- pdf.Image(imageFile("fpdf.png"), -1, 0, colWd, 0, true, "", 0, "")
+ pdf.Image(example.ImageFile("fpdf.png"), -1, 0, colWd, 0, true, "", 0, "")
} else if j == 5 {
- pdf.Image(imageFile("golang-gopher.png"),
+ pdf.Image(example.ImageFile("golang-gopher.png"),
-1, 0, colWd, 0, true, "", 0, "")
}
pdf.MultiCell(colWd, 5, loremStr, "", "", false)
pdf.Ln(-1)
}
- fileStr := exampleFilename("Fpdf_SetAcceptPageBreakFunc_landscape")
+ fileStr := example.Filename("Fpdf_SetAcceptPageBreakFunc_landscape")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetAcceptPageBreakFunc_landscape.pdf
}
@@ -607,15 +573,15 @@ func ExampleFpdf_SetAcceptPageBreakFunc() {
// This examples tests corner cases as reported by the gocov tool.
func ExampleFpdf_SetKeywords() {
var err error
- fileStr := exampleFilename("Fpdf_SetKeywords")
- err = gofpdf.MakeFont(fontFile("CalligrapherRegular.pfb"),
- fontFile("cp1252.map"), cnFontDir, nil, true)
+ fileStr := example.Filename("Fpdf_SetKeywords")
+ err = gofpdf.MakeFont(example.FontFile("CalligrapherRegular.pfb"),
+ example.FontFile("cp1252.map"), example.FontDir(), nil, true)
if err == nil {
- err = gofpdf.MakeFont(fontFile("calligra.ttf"),
- fontFile("cp1252.map"), cnFontDir, nil, true)
+ err = gofpdf.MakeFont(example.FontFile("calligra.ttf"),
+ example.FontFile("cp1252.map"), example.FontDir(), nil, true)
if err == nil {
pdf := gofpdf.New("", "", "", "")
- pdf.SetFontLocation(cnFontDir)
+ pdf.SetFontLocation(example.FontDir())
pdf.SetTitle("世界", true)
pdf.SetAuthor("世界", true)
pdf.SetSubject("世界", true)
@@ -628,7 +594,7 @@ func ExampleFpdf_SetKeywords() {
err = pdf.OutputFileAndClose(fileStr)
}
}
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetKeywords.pdf
}
@@ -709,9 +675,9 @@ func ExampleFpdf_Circle() {
pdf.SetLineWidth(thin)
pdf.SetLineCapStyle("butt")
- fileStr := exampleFilename("Fpdf_Circle_figures")
+ fileStr := example.Filename("Fpdf_Circle_figures")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Circle_figures.pdf
}
@@ -753,7 +719,7 @@ func ExampleFpdf_SetAlpha() {
pdf.SetXY(x, y+2)
pdf.CellFormat(rectW, rectH, "A", "", 0, "C", false, 0, "")
pdf.SetAlpha(0.5, modeList[j])
- pdf.Image(imageFile("golang-gopher.png"),
+ pdf.Image(example.ImageFile("golang-gopher.png"),
x-gapX, y, rectW+2*gapX, 0, false, "", 0, "")
pdf.SetAlpha(1.0, "Normal")
x += rectW + gapX
@@ -761,9 +727,9 @@ func ExampleFpdf_SetAlpha() {
}
y += rectH + gapY
}
- fileStr := exampleFilename("Fpdf_SetAlpha_transparency")
+ fileStr := example.Filename("Fpdf_SetAlpha_transparency")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetAlpha_transparency.pdf
}
@@ -784,9 +750,9 @@ func ExampleFpdf_LinearGradient() {
pdf.RadialGradient(115, 120, 75, 75, 220, 220, 250, 80, 80, 220,
0.25, 0.75, 0.75, 0.75, 0.75)
pdf.Rect(115, 120, 75, 75, "D")
- fileStr := exampleFilename("Fpdf_LinearGradient_gradient")
+ fileStr := example.Filename("Fpdf_LinearGradient_gradient")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_LinearGradient_gradient.pdf
}
@@ -829,7 +795,7 @@ func ExampleFpdf_ClipText() {
y += 28
pdf.ClipEllipse(26, y+10, 16, 10, true)
- pdf.Image(imageFile("logo.jpg"), 10, y, 32, 0, false, "JPG", 0, "")
+ pdf.Image(example.ImageFile("logo.jpg"), 10, y, 32, 0, false, "JPG", 0, "")
pdf.ClipEnd()
pdf.ClipCircle(60, y+10, 10, true)
@@ -854,9 +820,9 @@ func ExampleFpdf_ClipText() {
pdf.MultiCell(130, 5, lorem(), "", "", false)
pdf.ClipEnd()
- fileStr := exampleFilename("Fpdf_ClipText")
+ fileStr := example.Filename("Fpdf_ClipText")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_ClipText.pdf
}
@@ -866,7 +832,7 @@ func ExampleFpdf_PageSize() {
pdf := gofpdf.NewCustom(&gofpdf.InitType{
UnitStr: "in",
Size: gofpdf.SizeType{Wd: 6, Ht: 6},
- FontDirStr: cnFontDir,
+ FontDirStr: example.FontDir(),
})
pdf.SetMargins(0.5, 1, 0.5)
pdf.SetFont("Times", "", 14)
@@ -883,9 +849,9 @@ func ExampleFpdf_PageSize() {
wd, ht, u := pdf.PageSize(j)
fmt.Printf("%d: %6.2f %s, %6.2f %s\n", j, wd, u, ht, u)
}
- fileStr := exampleFilename("Fpdf_PageSize")
+ fileStr := example.Filename("Fpdf_PageSize")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// 0: 6.00 in, 6.00 in
// 1: 12.00 in, 3.00 in
@@ -909,9 +875,9 @@ func ExampleFpdf_Bookmark() {
pdf.Bookmark("Page 2", 0, 0)
pdf.Bookmark("Paragraph 3", 1, -1)
pdf.Cell(0, 6, "Paragraph 3")
- fileStr := exampleFilename("Fpdf_Bookmark")
+ fileStr := example.Filename("Fpdf_Bookmark")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Bookmark.pdf
}
@@ -1031,9 +997,9 @@ func ExampleFpdf_TransformBegin() {
refDupe()
pdf.TransformEnd()
- fileStr := exampleFilename("Fpdf_TransformBegin")
+ fileStr := example.Filename("Fpdf_TransformBegin")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_TransformBegin.pdf
}
@@ -1060,7 +1026,7 @@ func ExampleFpdf_RegisterImage() {
pdf.SetMargins(10, 10, 10)
pdf.SetFont("Helvetica", "", 15)
for j, str := range fileList {
- imageFileStr = imageFile(str)
+ imageFileStr = example.ImageFile(str)
infoPtr = pdf.RegisterImage(imageFileStr, "")
imgWd, imgHt = infoPtr.Extent()
switch j {
@@ -1082,10 +1048,10 @@ func ExampleFpdf_RegisterImage() {
}
pdf.Image(imageFileStr, lf, tp, imgWd, imgHt, false, "", 0, "")
}
- fileStr := exampleFilename("Fpdf_RegisterImage")
+ fileStr := example.Filename("Fpdf_RegisterImage")
// Test the image information retrieval method
infoShow := func(imageStr string) {
- imageStr = imageFile(imageStr)
+ imageStr = example.ImageFile(imageStr)
info := pdf.GetImageInfo(imageStr)
if info != nil {
if info.Width() > 0.0 {
@@ -1100,7 +1066,7 @@ func ExampleFpdf_RegisterImage() {
infoShow(fileList[0])
infoShow("foo.png")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Image image/logo-gray.png is registered
// Image image/foo.png is not registered
@@ -1129,9 +1095,9 @@ func ExampleFpdf_SplitLines() {
for _, line := range lines {
pdf.CellFormat(190.0, lineHt, string(line), "", 1, "C", false, 0, "")
}
- fileStr := exampleFilename("Fpdf_Splitlines")
+ fileStr := example.Filename("Fpdf_Splitlines")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Splitlines.pdf
}
@@ -1162,7 +1128,7 @@ func ExampleFpdf_SVGBasicWrite() {
`web control is supported and is used in this example.`
html := pdf.HTMLBasicNew()
html.Write(lineHt, htmlStr)
- sig, err = gofpdf.SVGBasicFileParse(imageFile(sigFileStr))
+ sig, err = gofpdf.SVGBasicFileParse(example.ImageFile(sigFileStr))
if err == nil {
scale := 100 / sig.Wd
scaleY := 30 / sig.Ht
@@ -1177,9 +1143,9 @@ func ExampleFpdf_SVGBasicWrite() {
} else {
pdf.SetError(err)
}
- fileStr := exampleFilename("Fpdf_SVGBasicWrite")
+ fileStr := example.Filename("Fpdf_SVGBasicWrite")
err = pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SVGBasicWrite.pdf
}
@@ -1230,9 +1196,9 @@ func ExampleFpdf_CellFormat_2() {
pdf.AddFont("Calligrapher", "", "calligra.json")
pdf.SetFont("Calligrapher", "", 16)
formatRect(pdf, recListBaseline)
- fileStr := exampleFilename("Fpdf_CellFormat_2_align")
+ fileStr := example.Filename("Fpdf_CellFormat_2_align")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Generalized font loader reading calligra.json
// Generalized font loader reading calligra.z
@@ -1264,9 +1230,9 @@ func ExampleFpdf_CellFormat_3() {
write("Falsches \xdcben von Xylophonmusik qu\xe4lt jeden gr\xf6\xdferen Zwerg.")
write("Heiz\xf6lr\xfccksto\xdfabd\xe4mpfung")
write("For\xe5rsj\xe6vnd\xf8gn / Efter\xe5rsj\xe6vnd\xf8gn")
- fileStr := exampleFilename("Fpdf_CellFormat_3_codepageescape")
+ fileStr := example.Filename("Fpdf_CellFormat_3_codepageescape")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_CellFormat_3_codepageescape.pdf
}
@@ -1274,7 +1240,7 @@ func ExampleFpdf_CellFormat_3() {
// This example demonstrates the automatic conversion of UTF-8 strings to an
// 8-bit font encoding.
func ExampleFpdf_CellFormat_4() {
- pdf := gofpdf.New("P", "mm", "A4", cnFontDir) // A4 210.0 x 297.0
+ pdf := gofpdf.New("P", "mm", "A4", example.FontDir()) // A4 210.0 x 297.0
// See documentation for details on how to generate fonts
pdf.AddFont("Helvetica-1251", "", "helvetica_1251.json")
pdf.AddFont("Helvetica-1253", "", "helvetica_1253.json")
@@ -1304,9 +1270,9 @@ func ExampleFpdf_CellFormat_4() {
tr = pdf.UnicodeTranslatorFromDescriptor("cp1253")
write("Θέλει αρετή και τόλμη η ελευθερία. (Ανδρέας Κάλβος)")
- fileStr := exampleFilename("Fpdf_CellFormat_4_codepage")
+ fileStr := example.Filename("Fpdf_CellFormat_4_codepage")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_CellFormat_4_codepage.pdf
}
@@ -1318,9 +1284,9 @@ func ExampleFpdf_SetProtection() {
pdf.AddPage()
pdf.SetFont("Arial", "", 12)
pdf.Write(10, "Password-protected.")
- fileStr := exampleFilename("Fpdf_SetProtection")
+ fileStr := example.Filename("Fpdf_SetProtection")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetProtection.pdf
}
@@ -1368,9 +1334,9 @@ func ExampleFpdf_Polygon() {
}
y += advance
}
- fileStr := exampleFilename("Fpdf_Polygon")
+ fileStr := example.Filename("Fpdf_Polygon")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Polygon.pdf
}
@@ -1408,9 +1374,9 @@ func ExampleFpdf_AddLayer() {
pdf.Write(8, "This line belongs to layer 1 again.\n")
pdf.EndLayer()
- fileStr := exampleFilename("Fpdf_AddLayer")
+ fileStr := example.Filename("Fpdf_AddLayer")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_AddLayer.pdf
}
@@ -1451,9 +1417,9 @@ func ExampleFpdf_RegisterImageReader() {
} else {
pdf.SetError(err)
}
- fileStr := exampleFilename("Fpdf_RegisterImageReader_url")
+ fileStr := example.Filename("Fpdf_RegisterImageReader_url")
err = pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_RegisterImageReader_url.pdf
@@ -1540,9 +1506,9 @@ func ExampleFpdf_Beziergon() {
pdf.SetDrawColor(64, 64, 128)
pdf.SetLineWidth(pdf.GetLineWidth() * 3)
pdf.Beziergon(curveList, "D")
- fileStr := exampleFilename("Fpdf_Beziergon")
+ fileStr := example.Filename("Fpdf_Beziergon")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_Beziergon.pdf
@@ -1559,9 +1525,9 @@ func ExampleFpdf_SetFontLoader() {
pdf.AddPage()
pdf.SetFont("Calligrapher", "", 35)
pdf.Cell(0, 10, "Load fonts from any source")
- fileStr := exampleFilename("Fpdf_SetFontLoader")
+ fileStr := example.Filename("Fpdf_SetFontLoader")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Generalized font loader reading calligra.json
// Generalized font loader reading calligra.z
@@ -1582,9 +1548,9 @@ func ExampleFpdf_MoveTo() {
pdf.SetFillColor(200, 200, 200)
pdf.SetLineWidth(3)
pdf.DrawPath("DF")
- fileStr := exampleFilename("Fpdf_MoveTo_path")
+ fileStr := example.Filename("Fpdf_MoveTo_path")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_MoveTo_path.pdf
}
@@ -1623,9 +1589,9 @@ func ExampleFpdf_SetLineJoinStyle() {
draw(caps[i], joins[i], x, 50, x, 160)
x += offset
}
- fileStr := exampleFilename("Fpdf_SetLineJoinStyle_caps")
+ fileStr := example.Filename("Fpdf_SetLineJoinStyle_caps")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_SetLineJoinStyle_caps.pdf
}
@@ -1699,9 +1665,9 @@ func ExampleFpdf_DrawPath() {
pdf.DrawPath("B*")
pdf.Text(115, 290, "B* (even odd)")
- fileStr := exampleFilename("Fpdf_DrawPath_fill")
+ fileStr := example.Filename("Fpdf_DrawPath_fill")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_DrawPath_fill.pdf
}
@@ -1712,7 +1678,7 @@ func ExampleFpdf_CreateTemplate() {
pdf.SetCompression(false)
// pdf.SetFont("Times", "", 12)
template := pdf.CreateTemplate(func(tpl *gofpdf.Tpl) {
- tpl.Image(imageFile("logo.png"), 6, 6, 30, 0, false, "", 0, "")
+ tpl.Image(example.ImageFile("logo.png"), 6, 6, 30, 0, false, "", 0, "")
tpl.SetFont("Arial", "B", 16)
tpl.Text(40, 20, "Template says hello")
tpl.SetDrawColor(0, 100, 200)
@@ -1726,7 +1692,7 @@ func ExampleFpdf_CreateTemplate() {
template2 := pdf.CreateTemplate(func(tpl *gofpdf.Tpl) {
tpl.UseTemplate(template)
subtemplate := tpl.CreateTemplate(func(tpl2 *gofpdf.Tpl) {
- tpl2.Image(imageFile("logo.png"), 6, 86, 30, 0, false, "", 0, "")
+ tpl2.Image(example.ImageFile("logo.png"), 6, 86, 30, 0, false, "", 0, "")
tpl2.SetFont("Arial", "B", 16)
tpl2.Text(40, 100, "Subtemplate says hello")
tpl2.SetDrawColor(0, 200, 100)
@@ -1752,9 +1718,9 @@ func ExampleFpdf_CreateTemplate() {
pdf.Line(60, 210, 80, 210)
pdf.Text(40, 200, "Template example page 2")
- fileStr := exampleFilename("Fpdf_CreateTemplate")
+ fileStr := example.Filename("Fpdf_CreateTemplate")
err := pdf.OutputFileAndClose(fileStr)
- summary(err, fileStr)
+ example.Summary(err, fileStr)
// Output:
// Successfully generated pdf/Fpdf_CreateTemplate.pdf
}
diff --git a/internal/example/example.go b/internal/example/example.go
new file mode 100644
index 0000000..8486994
--- /dev/null
+++ b/internal/example/example.go
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2015 Kurt Jung (Gmail: kurt.w.jung)
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+Package example provides some helper routines for the test packages of
+gofpdf and its various contributed packages located beneath the contrib
+directory.
+*/
+package example
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+)
+
+var gofpdfDir string
+
+func init() {
+ setRoot()
+}
+
+// Assign the relative path to the gofpdfDir directory based on current working
+// directory
+func setRoot() {
+ wdStr, err := os.Getwd()
+ if err == nil {
+ gofpdfDir = ""
+ sepStr := string(os.PathSeparator)
+ list := strings.Split(wdStr, sepStr)
+ for j := len(list) - 1; j >= 0 && list[j] != "gofpdf"; j-- {
+ gofpdfDir = filepath.Join(gofpdfDir, "..")
+ }
+ } else {
+ panic(err)
+ }
+}
+
+// ImageFile returns a qualified filename in which the path to the image
+// directory is prepended to the specified filename.
+func ImageFile(fileStr string) string {
+ return filepath.Join(gofpdfDir, "image", fileStr)
+}
+
+// FontDir returns the path to the font directory.
+func FontDir() string {
+ return filepath.Join(gofpdfDir, "font")
+}
+
+// FontFile returns a qualified filename in which the path to the font
+// directory is prepended to the specified filename.
+func FontFile(fileStr string) string {
+ return filepath.Join(FontDir(), fileStr)
+}
+
+// TextFile returns a qualified filename in which the path to the text
+// directory is prepended to the specified filename.
+func TextFile(fileStr string) string {
+ return filepath.Join(gofpdfDir, "text", fileStr)
+}
+
+// PdfDir returns the path to the PDF output directory.
+func PdfDir() string {
+ return filepath.Join(gofpdfDir, "pdf")
+}
+
+// PdfFile returns a qualified filename in which the path to the PDF output
+// directory is prepended to the specified filename.
+func PdfFile(fileStr string) string {
+ return filepath.Join(PdfDir(), fileStr)
+}
+
+// Filename returns a qualified filename in which the example PDF directory
+// path is prepended and the suffix ".pdf" is appended to the specified
+// filename.
+func Filename(baseStr string) string {
+ return PdfFile(baseStr + ".pdf")
+}
+
+// Summary generates a predictable report for use by test examples. If the
+// specified error is nil, the filename delimiters are normalized and the
+// filename printed to standard output with a success message. If the specified
+// error is not nil, its String() value is printed to standard output.
+func Summary(err error, fileStr string) {
+ if err == nil {
+ fileStr = filepath.ToSlash(fileStr)
+ fmt.Printf("Successfully generated %s\n", fileStr)
+ } else {
+ fmt.Println(err)
+ }
+}
diff --git a/internal/example/example_test.go b/internal/example/example_test.go
new file mode 100644
index 0000000..54f4689
--- /dev/null
+++ b/internal/example/example_test.go
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2015 Kurt Jung (Gmail: kurt.w.jung)
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+package example_test
+
+import (
+ "fmt"
+ "path/filepath"
+
+ "github.com/jung-kurt/gofpdf/internal/example"
+)
+
+// Test the Filename() function.
+func ExampleExample_Filename() {
+ fmt.Println(filepath.ToSlash(example.Filename("foo")))
+ // Output:
+ // ../../pdf/foo.pdf
+}
diff --git a/ttfparser_test.go b/ttfparser_test.go
index 9f494a6..3286db2 100644
--- a/ttfparser_test.go
+++ b/ttfparser_test.go
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013 Kurt Jung (Gmail: kurt.w.jung)
+ * Copyright (c) 2013-2015 Kurt Jung (Gmail: kurt.w.jung)
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
@@ -19,12 +19,13 @@ package gofpdf_test
import (
"bytes"
"fmt"
+
"github.com/jung-kurt/gofpdf"
- // "testing"
+ "github.com/jung-kurt/gofpdf/internal/example"
)
func ExampleTtfParse() {
- ttf, err := gofpdf.TtfParse(cnFontDir + "/calligra.ttf")
+ ttf, err := gofpdf.TtfParse(example.FontDir() + "/calligra.ttf")
if err == nil {
fmt.Printf("Postscript name: %s\n", ttf.PostScriptName)
fmt.Printf("unitsPerEm: %8d\n", ttf.UnitsPerEm)
@@ -55,7 +56,7 @@ func hexStr(s string) string {
}
func ExampleFpdf_GetStringWidth() {
- pdf := gofpdf.New("", "", "", cnFontDir)
+ pdf := gofpdf.New("", "", "", example.FontDir())
pdf.SetFont("Helvetica", "", 12)
pdf.AddPage()
for _, s := range []string{"Hello", "世界", "\xe7a va?"} {