diff options
-rw-r--r-- | doc.go | 25 | ||||
-rw-r--r-- | fpdf.go | 79 | ||||
-rw-r--r-- | fpdf_test.go | 338 | ||||
-rw-r--r-- | fpdftrans.go | 34 | ||||
-rw-r--r-- | htmlbasic.go | 2 | ||||
-rw-r--r-- | layer.go | 2 | ||||
-rw-r--r-- | svgbasic.go | 3 | ||||
-rw-r--r-- | util.go | 2 |
8 files changed, 247 insertions, 238 deletions
@@ -95,15 +95,15 @@ Later, to receive updates, run Quick Start -The following Go code generates a simple PDF. +The following Go code generates a simple PDF and writes it to standard output. - pdf := gofpdf.New("P", "mm", "A4", "../font") + pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "B", 16) pdf.Cell(40, 10, "Hello, world") pdf.Output(os.Stdout) -See the tutorials in the fpdf_test.go file (shown as examples in this +See the functions in the fpdf_test.go file (shown as examples in this documentation) for more advanced PDF examples. Errors @@ -138,17 +138,14 @@ that are passed to them; in these cases additional methods have been exported to provide similar functionality. Font definition files are produced in JSON rather than PHP. -Tutorials +Example PDFs -A side effect of running "go test" is the production of the tutorial 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 tutorials run in the context of a test. In order run an +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 -some helper routines, for example docWriter and strDelimit. In particular, -docWriter is used as an argument to OutputAndClose in order to reduce the -boilerplate in each example. In practice, you may be better served by calling -OutputFileAndClose(). +some helper routines, for example exampleFilename and summary. Nonstandard Fonts @@ -166,9 +163,9 @@ the font subdirectory and run the command as in the following example. ./makefont --embed --enc=../font/cp1252.map --dst=../font ../font/calligra.ttf In your PDF generation code, call AddFont() to load the font and, as with the -standard fonts, SetFont() to begin using it. See tutorial 7 for an example. -Good sources of free, open-source fonts include http://www.google.com/fonts/ -and http://dejavu-fonts.org/. +standard fonts, SetFont() to begin using it. Most examples, including the +package example, demonstrate this method. Good sources of free, open-source +fonts include http://www.google.com/fonts/ and http://dejavu-fonts.org/. Roadmap @@ -180,8 +180,8 @@ func fpdfNew(orientationStr, unitStr, sizeStr, fontDirStr string, size SizeType) // NewCustom returns a pointer to a new Fpdf instance. Its methods are // subsequently called to produce a single PDF document. NewCustom() is an -// alternative to New() that provides additional customization. This function -// is demonstrated in tutorial 15. +// alternative to New() that provides additional customization. The PageSize() +// example demonstrates this method. func NewCustom(init *InitType) (f *Fpdf) { return fpdfNew(init.OrientationStr, init.UnitStr, init.SizeStr, init.FontDirStr, init.Size) } @@ -318,8 +318,6 @@ func (f *Fpdf) SetFontLocation(fontDirStr string) { // the named font resources when AddFont() is called. If this operation fails, // an attempt is made to load the resources from the configured font directory // (see SetFontLocation()). -// -// See tutorial 29 for an example of this method. func (f *Fpdf) SetFontLoader(loader FontLoader) { f.fontLoader = loader } @@ -472,7 +470,7 @@ func (f *Fpdf) SetCreator(creatorStr string, isUTF8 bool) { // AliasNbPages defines an alias for the total number of pages. It will be // substituted as the document is closed. An empty string is replaced with the -// string "{nb}". This method is demonstrated in tutorial 2. +// string "{nb}". // // See the example for AddPage() for a demonstration of this method. func (f *Fpdf) AliasNbPages(aliasStr string) { @@ -528,7 +526,7 @@ func (f *Fpdf) Close() { // established in New(). These return values are followed by the unit of // measure itself. If pageNum is zero or otherwise out of bounds, it returns // the default page size, that is, the size of the page that would be added by -// AddPage(). This function is demonstrated in tutorial 15. +// AddPage(). func (f *Fpdf) PageSize(pageNum int) (wd, ht float64, unitStr string) { sz, ok := f.pageSizes[pageNum] if ok { @@ -546,7 +544,7 @@ func (f *Fpdf) PageSize(pageNum int) (wd, ht float64, unitStr string) { // // size specifies the size of the new page in the units established in New(). // -// This function is demonstrated in tutorial 15. +// The PageSize() example demonstrates this method. func (f *Fpdf) AddPageFormat(orientationStr string, size SizeType) { if f.err != nil { return @@ -829,7 +827,7 @@ func (f *Fpdf) SetLineJoinStyle(styleStr string) { // dash pattern is retained from page to page. Call this method with an empty // array to restore solid line drawing. // -// See tutorial 28 for an example of this function. +// The Beziergon() example demonstrates this method. func (f *Fpdf) SetDashPattern(dashArray []float64, dashPhase float64) { scaled := make([]float64, len(dashArray)) for i, value := range dashArray { @@ -908,8 +906,6 @@ func (f *Fpdf) Rect(x, y, w, h float64, styleStr string) { // outlined and filled. An empty string will be replaced with "D". Drawing uses // the current draw color and line width centered on the circle's perimeter. // Filling uses the current fill color. -// -// See tutorial 11 for an example of this function. func (f *Fpdf) Circle(x, y, r float64, styleStr string) { f.Ellipse(x, y, r, r, 0, styleStr) } @@ -925,7 +921,7 @@ func (f *Fpdf) Circle(x, y, r float64, styleStr string) { // the current draw color and line width centered on the ellipse's perimeter. // Filling uses the current fill color. // -// See tutorial 11 for an example of this function. +// The Circle() example demonstrates this method. func (f *Fpdf) Ellipse(x, y, rx, ry, degRotate float64, styleStr string) { f.arc(x, y, rx, ry, degRotate, 0, 360, styleStr, false) } @@ -939,8 +935,6 @@ func (f *Fpdf) Ellipse(x, y, rx, ry, degRotate float64, styleStr string) { // outlined and filled. An empty string will be replaced with "D". Drawing uses // the current draw color and line width centered on the ellipse's perimeter. // Filling uses the current fill color. -// -// See tutorial 25 for an example of this function. func (f *Fpdf) Polygon(points []PointType, styleStr string) { if len(points) > 2 { for j, pt := range points { @@ -966,8 +960,6 @@ func (f *Fpdf) Polygon(points []PointType, styleStr string) { // outlined and filled. An empty string will be replaced with "D". Drawing uses // the current draw color and line width centered on the ellipse's perimeter. // Filling uses the current fill color. -// -// See tutorial 28 for an example of this function. func (f *Fpdf) Beziergon(points []PointType, styleStr string) { // Thanks, Robert Lillack, for contributing this function. @@ -1013,7 +1005,7 @@ func (f *Fpdf) curve(cx0, cy0, cx1, cy1, x, y float64) { // the current draw color, line width, and cap style centered on the curve's // path. Filling uses the current fill color. // -// See tutorial 11 for an example of this function. +// The Circle() example demonstrates this method. func (f *Fpdf) Curve(x0, y0, cx, cy, x1, y1 float64, styleStr string) { f.point(x0, y0) f.outf("%.5f %.5f %.5f %.5f v %s", cx*f.k, (f.h-cy)*f.k, x1*f.k, (f.h-y1)*f.k, @@ -1045,7 +1037,7 @@ func (f *Fpdf) CurveCubic(x0, y0, cx0, cy0, x1, y1, cx1, cy1 float64, styleStr s // This routine performs the same function as CurveCubic() but uses standard // argument order. // -// See tutorial 11 for examples of this function. +// The Circle() example demonstrates this method. func (f *Fpdf) CurveBezierCubic(x0, y0, cx0, cy0, cx1, cy1, x1, y1 float64, styleStr string) { f.point(x0, y0) f.outf("%.5f %.5f %.5f %.5f %.5f %.5f c %s", cx0*f.k, (f.h-cy0)*f.k, @@ -1065,7 +1057,7 @@ func (f *Fpdf) CurveBezierCubic(x0, y0, cx0, cy0, cx1, cy1, x1, y1 float64, styl // the current draw color, line width, and cap style centered on the arc's // path. Filling uses the current fill color. // -// See tutorial 11 for an example of this function. +// The Circle() example demonstrates this method. func (f *Fpdf) Arc(x, y, rx, ry, degRotate, degStart, degEnd float64, styleStr string) { f.arc(x, y, rx, ry, degRotate, degStart, degEnd, styleStr, false) } @@ -1083,8 +1075,6 @@ func (f *Fpdf) Arc(x, y, rx, ry, degRotate, degStart, degEnd float64, styleStr s // // To reset normal rendering after applying a blending mode, call this method // with alpha set to 1.0 and blendModeStr set to "Normal". -// -// See tutorial 12 for an example of this function, including samples of each blending mode. func (f *Fpdf) SetAlpha(alpha float64, blendModeStr string) { if f.err != nil { return @@ -1153,8 +1143,6 @@ func (f *Fpdf) gradient(tp int, r1, g1, b1 int, r2, g2, b2 int, x1, y1 float64, // anchored on the rectangle edge. Color 1 is used up to the origin of the // vector and color 2 is used beyond the vector's end point. Between the points // the colors are gradually blended. -// -// See tutorial 13 for an example of this function. func (f *Fpdf) LinearGradient(x, y, w, h float64, r1, g1, b1 int, r2, g2, b2 int, x1, y1, x2, y2 float64) { f.gradientClipStart(x, y, w, h) f.gradient(2, r1, g1, b1, r2, g2, b2, x1, y1, x2, y2, 0) @@ -1178,7 +1166,7 @@ func (f *Fpdf) LinearGradient(x, y, w, h float64, r1, g1, b1 int, r2, g2, b2 int // center do not necessarily have to coincide, but the origin must be within // the circle to avoid rendering problems. // -// See tutorial 13 for an example of this function. +// The LinearGradient() example demonstrates this method. func (f *Fpdf) RadialGradient(x, y, w, h float64, r1, g1, b1 int, r2, g2, b2 int, x1, y1, x2, y2, r float64) { f.gradientClipStart(x, y, w, h) f.gradient(3, r1, g1, b1, r2, g2, b2, x1, y1, x2, y2, r) @@ -1193,7 +1181,7 @@ func (f *Fpdf) RadialGradient(x, y, w, h float64, r1, g1, b1 int, r2, g2, b2 int // Image(), LinearGradient(), etc) will be clipped by the specified rectangle. // Call ClipEnd() to restore unclipped operations. // -// See tutorial 14 for an example of this function. +// This ClipText() example demonstrates this method. func (f *Fpdf) ClipRect(x, y, w, h float64, outline bool) { f.clipNest++ f.outf("q %.2f %.2f %.2f %.2f re W %s", x*f.k, (f.h-y)*f.k, w*f.k, -h*f.k, strIf(outline, "S", "n")) @@ -1207,8 +1195,6 @@ func (f *Fpdf) ClipRect(x, y, w, h float64, outline bool) { // will be shown. After calling this method, all rendering operations (for // example, Image(), LinearGradient(), etc) will be clipped. Call ClipEnd() to // restore unclipped operations. -// -// See tutorial 14 for an example of this function. func (f *Fpdf) ClipText(x, y float64, txtStr string, outline bool) { f.clipNest++ f.outf("q BT %.5f %.5f Td %d Tr (%s) Tj ET", x*f.k, (f.h-y)*f.k, intIf(outline, 5, 7), f.escape(txtStr)) @@ -1229,7 +1215,7 @@ func (f *Fpdf) clipArc(x1, y1, x2, y2, x3, y3 float64) { // LinearGradient(), etc) will be clipped by the specified rectangle. Call // ClipEnd() to restore unclipped operations. // -// See tutorial 14 for an example of this function. +// This ClipText() example demonstrates this method. func (f *Fpdf) ClipRoundedRect(x, y, w, h, r float64, outline bool) { f.clipNest++ k := f.k @@ -1263,7 +1249,7 @@ func (f *Fpdf) ClipRoundedRect(x, y, w, h, r float64, outline bool) { // Image(), LinearGradient(), etc) will be clipped by the specified ellipse. // Call ClipEnd() to restore unclipped operations. // -// See tutorial 14 for an example of this function. +// This ClipText() example demonstrates this method. func (f *Fpdf) ClipEllipse(x, y, rx, ry float64, outline bool) { f.clipNest++ lx := (4.0 / 3.0) * rx * (math.Sqrt2 - 1) @@ -1297,7 +1283,7 @@ func (f *Fpdf) ClipEllipse(x, y, rx, ry float64, outline bool) { // operations (for example, Image(), LinearGradient(), etc) will be clipped by // the specified circle. Call ClipEnd() to restore unclipped operations. // -// See tutorial 14 for an example of this function. +// The ClipText() example demonstrates this method. func (f *Fpdf) ClipCircle(x, y, r float64, outline bool) { f.ClipEllipse(x, y, r, r, outline) } @@ -1312,7 +1298,7 @@ func (f *Fpdf) ClipCircle(x, y, r float64, outline bool) { // LinearGradient(), etc) will be clipped by the specified polygon. Call // ClipEnd() to restore unclipped operations. // -// See tutorial 14 for an example of this function. +// The ClipText() example demonstrates this method. func (f *Fpdf) ClipPolygon(points []PointType, outline bool) { f.clipNest++ var s fmtBuffer @@ -1331,7 +1317,7 @@ func (f *Fpdf) ClipPolygon(points []PointType, outline bool) { // ClipPolygon(). Clipping operations can be nested. The document cannot be // successfully output while a clipping operation is active. // -// See tutorial 14 for an example of this function. +// The ClipText() example demonstrates this method. func (f *Fpdf) ClipEnd() { if f.err == nil { if f.clipNest > 0 { @@ -1363,8 +1349,6 @@ func (f *Fpdf) ClipEnd() { // fileStr specifies the base name with ".json" extension of the font // definition file to be added. The file will be loaded from the font directory // specified in the call to New() or SetFontLocation(). -// -// See tutorial 7 for an example of this function. func (f *Fpdf) AddFont(familyStr, styleStr, fileStr string) { if fileStr == "" { fileStr = strings.Replace(familyStr, " ", "", -1) + strings.ToLower(styleStr) + ".json" @@ -1615,8 +1599,6 @@ func (f *Fpdf) LinkString(x, y, w, h float64, linkStr string) { // the outline; 0 is the top level, 1 is just below, and so on. y specifies the // vertical position of the bookmark destination in the current page; -1 // indicates the current position. -// -// See tutorial 16 for an bookmark example. func (f *Fpdf) Bookmark(txtStr string, level int, y float64) { if y == -1 { y = f.y @@ -1690,8 +1672,6 @@ func (f *Fpdf) SetAcceptPageBreakFunc(fnc func() bool) { // // linkStr is a target URL or empty for no external link. A non--zero value for // link takes precedence over linkStr. -// -// See tutorial 21 for a demonstration of text alignment within a cell. func (f *Fpdf) CellFormat(w, h float64, txtStr string, borderStr string, ln int, alignStr string, fill bool, link int, linkStr string) { // dbg("CellFormat. h = %.2f, borderStr = %s", h, borderStr) if f.err != nil { @@ -1836,8 +1816,6 @@ func (f *Fpdf) Cellf(w, h float64, fmtStr string, args ...interface{}) { // // You can use MultiCell if you want to print a text on several lines in a // simple way. -// -// See tutorial 19 for an example of this function. func (f *Fpdf) SplitLines(txt []byte, w float64) [][]byte { // Function contributed by Bruno Michel lines := [][]byte{} @@ -2249,9 +2227,6 @@ func (f *Fpdf) Image(imageNameStr string, x, y, w, h float64, flow bool, tp stri // case. // // See Image() for restrictions on the image and the "tp" parameters. -// -// See tutorial 27 for an example of how this function can be used to load an -// image from the web. func (f *Fpdf) RegisterImageReader(imgName, tp string, r io.Reader) (info *ImageInfoType) { // Thanks, Ivan Daniluk, for generalizing this code to use the Reader interface. if f.err != nil { @@ -2295,8 +2270,6 @@ func (f *Fpdf) RegisterImageReader(imgName, tp string, r io.Reader) (info *Image // page. Note that Image() calls this function, so this function is only // necessary if you need information about the image before placing it. See // Image() for restrictions on the image and the "tp" parameters. -// -// See tutorial 18 for an example of this function. func (f *Fpdf) RegisterImage(fileStr, tp string) (info *ImageInfoType) { info, ok := f.images[fileStr] if ok { @@ -2396,8 +2369,6 @@ func (f *Fpdf) SetXY(x, y float64) { // full access to the document regardless of the actionFlag value. An empty // string for this argument will be replaced with a random value, effectively // prohibiting full access to the document. -// -// See tutorial 24 for an example of this function. func (f *Fpdf) SetProtection(actionFlag byte, userPassStr, ownerPassStr string) { if f.err != nil { return @@ -2418,7 +2389,7 @@ func (f *Fpdf) OutputAndClose(w io.WriteCloser) error { // writes the PDF document to it. This method will close f and the newly // written file, even if an error is detected and no document is produced. // -// This function is demonstrated in tutorial 1. +// Most examples demonstrate the use of this method. func (f *Fpdf) OutputFileAndClose(fileStr string) error { if f.err == nil { pdfFile, err := os.Create(fileStr) @@ -3473,8 +3444,6 @@ func (f *Fpdf) enddoc() { // using the path drawing routines rather than multiple Fpdf.Line is // that PDF creates nice line joins at the angles, rather than just // overlaying the lines. -// -// See tutorial 30 for an example of this function. func (f *Fpdf) MoveTo(x, y float64) { f.point(x, y) f.x, f.y = x, y @@ -3484,7 +3453,7 @@ func (f *Fpdf) MoveTo(x, y float64) { // becomes the new stylus location. Note that this only creates the line in // the path; it does not actually draw the line on the page. // -// See tutorial 30 for an example of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) LineTo(x, y float64) { f.outf("%.2f %.2f l", x*f.k, (f.h-y)*f.k) f.x, f.y = x, y @@ -3497,7 +3466,7 @@ func (f *Fpdf) LineTo(x, y float64) { // point. At the end point, the curve is tangent to the straight line between // the end point and the control point. // -// See tutorial 30 for an example of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) CurveTo(cx, cy, x, y float64) { f.outf("%.5f %.5f %.5f %.5f v", cx*f.k, (f.h-cy)*f.k, x*f.k, (f.h-y)*f.k) f.x, f.y = x, y @@ -3511,7 +3480,7 @@ func (f *Fpdf) CurveTo(cx, cy, x, y float64) { // the curve is tangent to the straight line between the end point and the // control point (cx1, cy1). // -// See tutorial 30 for examples of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) CurveBezierCubicTo(cx0, cy0, cx1, cy1, x, y float64) { f.curve(cx0, cy0, cx1, cy1, x, y) f.x, f.y = x, y @@ -3521,7 +3490,7 @@ func (f *Fpdf) CurveBezierCubicTo(cx0, cy0, cx1, cy1, x, y float64) { // (if not the same) and mark the path as closed so the first and last lines // join nicely. // -// See tutorial 30 for an example of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) ClosePath() { f.outf("h") } @@ -3543,7 +3512,7 @@ func (f *Fpdf) ClosePath() { // centered on the // path. Filling uses the current fill color. // -// See tutorial 30 for an example of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) DrawPath(styleStr string) { f.outf(fillDrawOp(styleStr)) } @@ -3562,7 +3531,7 @@ func (f *Fpdf) DrawPath(styleStr string) { // the current draw color, line width, and cap style centered on the arc's // path. Filling uses the current fill color. // -// See tutorial 30 for an example of this function. +// The MoveTo() example demonstrates this method. func (f *Fpdf) ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) { f.arc(x, y, rx, ry, degRotate, degStart, degEnd, "", true) } diff --git a/fpdf_test.go b/fpdf_test.go index da4b930..c2886fb 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -41,57 +41,17 @@ const ( cnExampleDir = cnGofpdfDir + "/pdf" ) -type nullWriter struct { +func init() { + cleanup() } -func (nw *nullWriter) Write(p []byte) (n int, err error) { - n = len(p) - return -} - -func (nw *nullWriter) Close() (err error) { - return -} - -type pdfWriter struct { - pdf *gofpdf.Fpdf - fl *os.File - idx int -} - -func (pw *pdfWriter) Write(p []byte) (n int, err error) { - if pw.pdf.Ok() { - return pw.fl.Write(p) - } - return -} - -func (pw *pdfWriter) Close() (err error) { - if pw.fl != nil { - pw.fl.Close() - pw.fl = nil - } - if pw.pdf.Ok() { - fmt.Printf("Successfully generated pdf/tutorial%02d.pdf\n", pw.idx) - } else { - fmt.Printf("%s\n", pw.pdf.Error()) - } - return -} - -func docWriter(pdf *gofpdf.Fpdf, idx int) *pdfWriter { - pw := new(pdfWriter) - pw.pdf = pdf - pw.idx = idx - if pdf.Ok() { - var err error - fileStr := fmt.Sprintf("%s/pdf/tutorial%02d.pdf", cnGofpdfDir, idx) - pw.fl, err = os.Create(fileStr) - if err != nil { - pdf.SetErrorf("Error opening output file %s", fileStr) +func cleanup() { + filepath.Walk(cnExampleDir, func(path string, info os.FileInfo, err error) (reterr error) { + if path[len(path)-4:] == ".pdf" { + os.Remove(path) } - } - return pw + return + }) } func imageFile(fileStr string) string { @@ -381,8 +341,8 @@ func ExampleFpdf_SetLeftMargin() { // Successfully generated pdf/multicolumn.pdf } -// Various table styles -func ExampleFpdf_tutorial05() { +// This example demonstrates various table styles. +func ExampleFpdf_CellFormat_1() { pdf := gofpdf.New("P", "mm", "A4", "") type countryType struct { nameStr, capitalStr, areaStr, popStr string @@ -496,14 +456,16 @@ func ExampleFpdf_tutorial05() { improvedTable() pdf.AddPage() fancyTable() - pdf.OutputAndClose(docWriter(pdf, 5)) + fileStr := exampleFilename("tables") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial05.pdf + // Successfully generated pdf/tables.pdf } // This example demonstrates internal and external links with and without basic // HTML. -func ExampleFpdf_tutorial06() { +func ExampleFpdf_HTMLBasicNew() { pdf := gofpdf.New("P", "mm", "A4", "") // First page: manual local link pdf.AddPage() @@ -527,25 +489,29 @@ func ExampleFpdf_tutorial06() { `<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) - pdf.OutputAndClose(docWriter(pdf, 6)) + fileStr := exampleFilename("html") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial06.pdf + // Successfully generated pdf/html.pdf } -// Non-standard font -func ExampleFpdf_tutorial07() { +// This example demonstrates the use of a non-standard font. +func ExampleFpdf_AddFont() { pdf := gofpdf.New("P", "mm", "A4", cnFontDir) pdf.AddFont("Calligrapher", "", "calligra.json") pdf.AddPage() pdf.SetFont("Calligrapher", "", 35) pdf.Cell(0, 10, "Enjoy new fonts with FPDF!") - pdf.OutputAndClose(docWriter(pdf, 7)) + fileStr := exampleFilename("font") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial07.pdf + // Successfully generated pdf/font.pdf } -// Various image types -func ExampleFpdf_tutorial08() { +// This example demonstrates how images are included in documents. +func ExampleFpdf_Image() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "", 11) @@ -559,13 +525,15 @@ func ExampleFpdf_tutorial08() { pdf.Text(50, 110, "logo-rgb.png") pdf.Image(imageFile("logo.jpg"), 10, 130, 30, 0, false, "", 0, "") pdf.Text(50, 140, "logo.jpg") - pdf.OutputAndClose(docWriter(pdf, 8)) + fileStr := exampleFilename("image") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial08.pdf + // Successfully generated pdf/image.pdf } -// Landscape mode with logos -func ExampleFpdf_tutorial09() { +// This examples demonstrates Landscape mode with images. +func ExampleFpdf_SetAcceptPageBreakFunc() { var y0 float64 var crrntCol int loremStr := lorem() @@ -616,13 +584,15 @@ func ExampleFpdf_tutorial09() { pdf.MultiCell(colWd, 5, loremStr, "", "", false) pdf.Ln(-1) } - pdf.OutputAndClose(docWriter(pdf, 9)) + fileStr := exampleFilename("landscape") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial09.pdf + // Successfully generated pdf/landscape.pdf } -// Test the corner cases as reported by the gocov tool -func ExampleFpdf_tutorial10() { +// This examples tests corner cases as reported by the gocov tool. +func ExampleFpdf_SetKeywords() { gofpdf.MakeFont(fontFile("calligra.ttf"), fontFile("cp1252.map"), cnFontDir, nil, true) pdf := gofpdf.New("", "", "", "") pdf.SetFontLocation(cnFontDir) @@ -635,13 +605,15 @@ func ExampleFpdf_tutorial10() { pdf.AddPage() pdf.SetFont("Calligrapher", "", 16) pdf.Writef(5, "\x95 %s \x95", pdf) - pdf.OutputAndClose(docWriter(pdf, 10)) + fileStr := exampleFilename("keywords") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial10.pdf + // Successfully generated pdf/keywords.pdf } -// Geometric figures -func ExampleFpdf_tutorial11() { +// This example demonstrates the construction of various geometric figures, +func ExampleFpdf_Circle() { const ( thin = 0.2 thick = 3.0 @@ -716,13 +688,15 @@ func ExampleFpdf_tutorial11() { pdf.SetLineWidth(thin) pdf.SetLineCapStyle("butt") - pdf.OutputAndClose(docWriter(pdf, 11)) + fileStr := exampleFilename("figures") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial11.pdf + // Successfully generated pdf/figures.pdf } -// Transparency -func ExampleFpdf_tutorial12() { +// This example demonstrates alpha transparency. +func ExampleFpdf_SetAlpha() { const ( gapX = 10.0 gapY = 9.0 @@ -765,13 +739,15 @@ func ExampleFpdf_tutorial12() { } y += rectH + gapY } - pdf.OutputAndClose(docWriter(pdf, 12)) + fileStr := exampleFilename("transparency") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial12.pdf + // Successfully generated pdf/transparency.pdf } -// Gradients -func ExampleFpdf_tutorial13() { +// This example deomstrates various gradients. +func ExampleFpdf_LinearGradient() { pdf := gofpdf.New("", "", "", "") pdf.SetFont("Helvetica", "", 12) pdf.AddPage() @@ -784,13 +760,15 @@ func ExampleFpdf_tutorial13() { pdf.Rect(20, 120, 75, 75, "D") 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") - pdf.OutputAndClose(docWriter(pdf, 13)) + fileStr := exampleFilename("gradient") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial13.pdf + // Successfully generated pdf/gradient.pdf } -// Clipping examples -func ExampleFpdf_tutorial14() { +// This example demonstrates clipping. +func ExampleFpdf_ClipText() { pdf := gofpdf.New("", "", "", "") y := 10.0 pdf.AddPage() @@ -844,13 +822,15 @@ func ExampleFpdf_tutorial14() { pdf.MultiCell(130, 5, lorem(), "", "", false) pdf.ClipEnd() - pdf.OutputAndClose(docWriter(pdf, 14)) + fileStr := exampleFilename("clip") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial14.pdf + // Successfully generated pdf/clip.pdf } -// Page size example -func ExampleFpdf_tutorial15() { +// This example generates a PDF document with various page sizes. +func ExampleFpdf_PageSize() { pdf := gofpdf.NewCustom(&gofpdf.InitType{ UnitStr: "in", Size: gofpdf.SizeType{Wd: 6, Ht: 6}, @@ -871,17 +851,19 @@ func ExampleFpdf_tutorial15() { wd, ht, u := pdf.PageSize(j) fmt.Printf("%d: %6.2f %s, %6.2f %s\n", j, wd, u, ht, u) } - pdf.OutputAndClose(docWriter(pdf, 15)) + fileStr := exampleFilename("pagesize") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: // 0: 6.00 in, 6.00 in // 1: 12.00 in, 3.00 in // 2: 6.00 in, 6.00 in // 3: 3.00 in, 12.00 in - // Successfully generated pdf/tutorial15.pdf + // Successfully generated pdf/pagesize.pdf } -// Bookmark test -func ExampleFpdf_tutorial16() { +// This example demonstrates the Bookmark method. +func ExampleFpdf_Bookmark() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetFont("Arial", "", 15) @@ -895,14 +877,16 @@ func ExampleFpdf_tutorial16() { pdf.Bookmark("Page 2", 0, 0) pdf.Bookmark("Paragraph 3", 1, -1) pdf.Cell(0, 6, "Paragraph 3") - pdf.OutputAndClose(docWriter(pdf, 16)) + fileStr := exampleFilename("bookmark") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial16.pdf + // Successfully generated pdf/bookmark.pdf } -// Transformation test adapted from an example script by Moritz Wagner and -// Andreas Würmser. -func ExampleFpdf_tutorial17() { +// This example demonstrates various transformations. It is adapted from an +// example script by Moritz Wagner and Andreas Würmser. +func ExampleFpdf_TransformBegin() { const ( light = 200 dark = 0 @@ -1014,13 +998,15 @@ func ExampleFpdf_tutorial17() { refDupe() pdf.TransformEnd() - pdf.OutputAndClose(docWriter(pdf, 17)) + fileStr := exampleFilename("transform") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial17.pdf + // Successfully generated pdf/transform.pdf } -// Example to demonstrate Lawrence Kesteloot's image registration code. -func ExampleFpdf_tutorial18() { +// This example demonstrates Lawrence Kesteloot's image registration code. +func ExampleFpdf_RegisterImage() { const ( margin = 10 wd = 210 @@ -1034,15 +1020,15 @@ func ExampleFpdf_tutorial18() { "logo-progressive.jpg", } var infoPtr *gofpdf.ImageInfoType - var fileStr string + var imageFileStr string var imgWd, imgHt, lf, tp float64 pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.SetMargins(10, 10, 10) pdf.SetFont("Helvetica", "", 15) for j, str := range fileList { - fileStr = imageFile(str) - infoPtr = pdf.RegisterImage(fileStr, "") + imageFileStr = imageFile(str) + infoPtr = pdf.RegisterImage(imageFileStr, "") imgWd, imgHt = infoPtr.Extent() switch j { case 0: @@ -1061,15 +1047,17 @@ func ExampleFpdf_tutorial18() { lf = wd - imgWd - margin tp = ht - imgHt - margin } - pdf.Image(fileStr, lf, tp, imgWd, imgHt, false, "", 0, "") + pdf.Image(imageFileStr, lf, tp, imgWd, imgHt, false, "", 0, "") } - pdf.OutputAndClose(docWriter(pdf, 18)) + fileStr := exampleFilename("registerimage") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial18.pdf + // Successfully generated pdf/registerimage.pdf } -// Example to demonstrate Bruno Michel's line splitting function. -func ExampleFpdf_tutorial19() { +// This example demonstrates Bruno Michel's line splitting function. +func ExampleFpdf_SplitLines() { const ( fontPtSize = 18.0 wd = 100.0 @@ -1090,14 +1078,16 @@ func ExampleFpdf_tutorial19() { for _, line := range lines { pdf.CellFormat(190.0, lineHt, string(line), "", 1, "C", false, 0, "") } - pdf.OutputAndClose(docWriter(pdf, 19)) + fileStr := exampleFilename("splitlines") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial19.pdf + // Successfully generated pdf/splitlines.pdf } // This example demonstrates how to render a simple path-only SVG image of the // type generated by the jSignature web control. -func ExampleFpdf_tutorial20() { +func ExampleFpdf_SVGBasicWrite() { const ( fontPtSize = 16.0 wd = 100.0 @@ -1136,14 +1126,16 @@ func ExampleFpdf_tutorial20() { } else { pdf.SetError(err) } - pdf.OutputAndClose(docWriter(pdf, 20)) + fileStr := exampleFilename("svg") + err = pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial20.pdf + // Successfully generated pdf/svg.pdf } // This example demonstrates Stefan Schroeder's code to control vertical // alignment. -func ExampleFpdf_tutorial21() { +func ExampleFpdf_CellFormat_2() { type recType struct { align, txt string } @@ -1173,15 +1165,17 @@ func ExampleFpdf_tutorial21() { } linkStr = "https://github.com/jung-kurt/gofpdf" } - pdf.OutputAndClose(docWriter(pdf, 21)) + fileStr := exampleFilename("align") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial21.pdf + // Successfully generated pdf/align.pdf } // This example demonstrates the use of characters in the high range of the -// Windows-1252 code page (gofdpf default). See the following example (23) for -// a way to do this automatically. -func ExampleFpdf_tutorial22() { +// Windows-1252 code page (gofdpf default). See the example for CellFormat (4) +// for a way to do this automatically. +func ExampleFpdf_CellFormat_3() { pdf := gofpdf.New("P", "mm", "A4", "") // A4 210.0 x 297.0 fontSize := 16.0 pdf.SetFont("Helvetica", "", fontSize) @@ -1203,14 +1197,16 @@ func ExampleFpdf_tutorial22() { 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") - pdf.OutputAndClose(docWriter(pdf, 22)) + fileStr := exampleFilename("codepageescape") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial22.pdf + // Successfully generated pdf/codepageescape.pdf } -// This example demonstrates the conversion of UTF-8 strings to an 8-bit font -// encoding. -func ExampleFpdf_tutorial23() { +// 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 // See documentation for details on how to generate fonts pdf.AddFont("Helvetica-1251", "", "helvetica_1251.json") @@ -1241,26 +1237,30 @@ func ExampleFpdf_tutorial23() { tr = pdf.UnicodeTranslatorFromDescriptor("cp1253") write("Θέλει αρετή και τόλμη η ελευθερία. (Ανδρέας Κάλβος)") - pdf.OutputAndClose(docWriter(pdf, 23)) + fileStr := exampleFilename("codepage") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial23.pdf + // Successfully generated pdf/codepage.pdf } -// This example demonstrates document protection. -func ExampleFpdf_tutorial24() { +// This example demonstrates password protection for documents. +func ExampleFpdf_SetProtection() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetProtection(gofpdf.CnProtectPrint, "123", "abc") pdf.AddPage() pdf.SetFont("Arial", "", 12) pdf.Write(10, "Password-protected.") - pdf.OutputAndClose(docWriter(pdf, 24)) + fileStr := exampleFilename("protection") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial24.pdf + // Successfully generated pdf/protection.pdf } // This example displays equilateral polygons in a demonstration of the Polygon // function. -func ExampleFpdf_tutorial25() { +func ExampleFpdf_Polygon() { const rowCount = 5 const colCount = 4 const ptSize = 36 @@ -1299,16 +1299,18 @@ func ExampleFpdf_tutorial25() { } y += advance } - pdf.OutputAndClose(docWriter(pdf, 25)) + fileStr := exampleFilename("polygon") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial25.pdf + // Successfully generated pdf/polygon.pdf } // This example demonstrates document layers. The initial visibility of a layer // is specified with the second parameter to AddLayer(). The layer list // displayed by the document reader allows layer visibility to be controlled // interactively. -func ExampleFpdf_tutorial26() { +func ExampleFpdf_AddLayer() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() @@ -1337,15 +1339,17 @@ func ExampleFpdf_tutorial26() { pdf.Write(8, "This line belongs to layer 1 again.\n") pdf.EndLayer() - pdf.OutputAndClose(docWriter(pdf, 26)) + fileStr := exampleFilename("layer") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial26.pdf + // Successfully generated pdf/layer.pdf } // This example demonstrates the use of an image that is retrieved from a web // server. -func ExampleFpdf_tutorial27() { +func ExampleFpdf_RegisterImageReader() { const ( margin = 10 @@ -1378,14 +1382,16 @@ func ExampleFpdf_tutorial27() { } else { pdf.SetError(err) } - pdf.OutputAndClose(docWriter(pdf, 27)) + fileStr := exampleFilename("imagemime") + err = pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial27.pdf + // Successfully generated pdf/imagemime.pdf } // This example demonstrates the Beziergon function. -func ExampleFpdf_tutorial28() { +func ExampleFpdf_Beziergon() { const ( margin = 10 @@ -1465,31 +1471,37 @@ func ExampleFpdf_tutorial28() { pdf.SetDrawColor(64, 64, 128) pdf.SetLineWidth(pdf.GetLineWidth() * 3) pdf.Beziergon(curveList, "D") - pdf.OutputAndClose(docWriter(pdf, 28)) + fileStr := exampleFilename("beziergon") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial28.pdf + // Successfully generated pdf/beziergon.pdf } -// Non-standard font using generalized font loader -func ExampleFpdf_tutorial29() { +// This example demonstrates loading a non-standard font using a generalized +// font loader. fontResourceType implements the FontLoader interface and is +// defined locally in the test source code. +func ExampleFpdf_SetFontLoader() { var fr fontResourceType - pdf := gofpdf.New("P", "mm", "A4", cnFontDir) + pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetFontLoader(fr) pdf.AddFont("Calligrapher", "", "calligra.json") pdf.AddPage() pdf.SetFont("Calligrapher", "", 35) pdf.Cell(0, 10, "Load fonts from any source") - pdf.OutputAndClose(docWriter(pdf, 29)) + fileStr := exampleFilename("fontload") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: // Generalized font loader reading calligra.json // Generalized font loader reading calligra.z - // Successfully generated pdf/tutorial29.pdf + // Successfully generated pdf/fontload.pdf } // This example demonstrates the Path Drawing functions, such as: MoveTo, // LineTo, CurveTo, ..., ClosePath and DrawPath. -func ExampleFpdf_tutorial30() { +func ExampleFpdf_MoveTo() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.AddPage() pdf.MoveTo(20, 20) @@ -1501,12 +1513,15 @@ func ExampleFpdf_tutorial30() { pdf.SetFillColor(200, 200, 200) pdf.SetLineWidth(3) pdf.DrawPath("DF") - pdf.OutputAndClose(docWriter(pdf, 30)) + fileStr := exampleFilename("path") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial30.pdf + // Successfully generated pdf/path.pdf } -func ExampleFpdf_tutorial31() { +// This example demonstrates various line cap and line join styles. +func ExampleFpdf_SetLineJoinStyle() { const offset = 75.0 pdf := gofpdf.New("L", "mm", "A4", "") pdf.AddPage() @@ -1539,14 +1554,15 @@ func ExampleFpdf_tutorial31() { draw(caps[i], joins[i], x, 50, x, 160) x += offset } - pdf.OutputAndClose(docWriter(pdf, 31)) + fileStr := exampleFilename("joinstyle") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial31.pdf + // Successfully generated pdf/joinstyle.pdf } -// This example demonstrates the Path Drawing functions, such as: MoveTo, -// LineTo, CurveTo, ..., ClosePath and DrawPath. -func ExampleFpdf_tutorial32() { +// This example demonstrates various fill modes. +func ExampleFpdf_DrawPath() { pdf := gofpdf.New("P", "mm", "A4", "") pdf.SetDrawColor(0xff, 0x00, 0x00) pdf.SetFillColor(0x99, 0x99, 0x99) @@ -1614,7 +1630,9 @@ func ExampleFpdf_tutorial32() { pdf.DrawPath("B*") pdf.Text(115, 290, "B* (even odd)") - pdf.OutputAndClose(docWriter(pdf, 32)) + fileStr := exampleFilename("fill") + err := pdf.OutputFileAndClose(fileStr) + summary(err, fileStr) // Output: - // Successfully generated pdf/tutorial32.pdf + // Successfully generated pdf/fill.pdf } diff --git a/fpdftrans.go b/fpdftrans.go index b87d9b9..9cda397 100644 --- a/fpdftrans.go +++ b/fpdftrans.go @@ -20,8 +20,6 @@ type TransformMatrix struct { // TransformScale(), TransformSkew(), etc. This is followed by text, drawing or // image output and finally a call to TransformEnd(). All transformation // contexts must be properly ended prior to outputting the document. -// -// See tutorial 17 for transformation examples. func (f *Fpdf) TransformBegin() { f.transformNest++ f.out("q") @@ -29,6 +27,8 @@ func (f *Fpdf) TransformBegin() { // TransformScaleX scales the width of the following text, drawings and images. // scaleWd is the percentage scaling factor. (x, y) is center of scaling. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformScaleX(scaleWd, x, y float64) { f.TransformScale(scaleWd, 100, x, y) } @@ -36,6 +36,8 @@ func (f *Fpdf) TransformScaleX(scaleWd, x, y float64) { // TransformScaleY scales the height of the following text, drawings and // images. scaleHt is the percentage scaling factor. (x, y) is center of // scaling. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformScaleY(scaleHt, x, y float64) { f.TransformScale(100, scaleHt, x, y) } @@ -43,6 +45,8 @@ func (f *Fpdf) TransformScaleY(scaleHt, x, y float64) { // TransformScaleXY uniformly scales the width and height of the following // text, drawings and images. s is the percentage scaling factor for both width // and height. (x, y) is center of scaling. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformScaleXY(s, x, y float64) { f.TransformScale(s, s, x, y) } @@ -50,6 +54,8 @@ func (f *Fpdf) TransformScaleXY(s, x, y float64) { // TransformScale generally scales the following text, drawings and images. // scaleWd and scaleHt are the percentage scaling factors for width and height. // (x, y) is center of scaling. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformScale(scaleWd, scaleHt, x, y float64) { if scaleWd == 0 || scaleHt == 0 { f.err = fmt.Errorf("scale factor cannot be zero") @@ -65,18 +71,24 @@ func (f *Fpdf) TransformScale(scaleWd, scaleHt, x, y float64) { // TransformMirrorHorizontal horizontally mirrors the following text, drawings // and images. x is the axis of reflection. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformMirrorHorizontal(x float64) { f.TransformScale(-100, 100, x, f.y) } // TransformMirrorVertical vertically mirrors the following text, drawings and // images. y is the axis of reflection. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformMirrorVertical(y float64) { f.TransformScale(100, -100, f.x, y) } // TransformMirrorPoint symmetrically mirrors the following text, drawings and // images on the point specified by (x, y). +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformMirrorPoint(x, y float64) { f.TransformScale(-100, -100, x, y) } @@ -85,6 +97,8 @@ func (f *Fpdf) TransformMirrorPoint(x, y float64) { // images on the line defined by angle and the point (x, y). angles is // specified in degrees and measured counter-clockwise from the 3 o'clock // position. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformMirrorLine(angle, x, y float64) { f.TransformScale(-100, 100, x, y) f.TransformRotate(-2*(angle-90), x, y) @@ -92,18 +106,24 @@ func (f *Fpdf) TransformMirrorLine(angle, x, y float64) { // TransformTranslateX moves the following text, drawings and images // horizontally by the amount specified by tx. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformTranslateX(tx float64) { f.TransformTranslate(tx, 0) } // TransformTranslateY moves the following text, drawings and images vertically // by the amount specified by ty. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformTranslateY(ty float64) { f.TransformTranslate(0, ty) } // TransformTranslate moves the following text, drawings and images // horizontally and vertically by the amounts specified by tx and ty. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformTranslate(tx, ty float64) { f.Transform(TransformMatrix{1, 0, 0, 1, tx * f.k, -ty * f.k}) } @@ -111,6 +131,8 @@ func (f *Fpdf) TransformTranslate(tx, ty float64) { // TransformRotate rotates the following text, drawings and images around the // center point (x, y). angle is specified in degrees and measured // counter-clockwise from the 3 o'clock position. +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformRotate(angle, x, y float64) { y = (f.h - y) * f.k x *= f.k @@ -128,6 +150,8 @@ func (f *Fpdf) TransformRotate(angle, x, y float64) { // TransformSkewX horizontally skews the following text, drawings and images // keeping the point (x, y) stationary. angleX ranges from -90 degrees (skew to // the left) to 90 degrees (skew to the right). +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformSkewX(angleX, x, y float64) { f.TransformSkew(angleX, 0, x, y) } @@ -135,6 +159,8 @@ func (f *Fpdf) TransformSkewX(angleX, x, y float64) { // TransformSkewY vertically skews the following text, drawings and images // keeping the point (x, y) stationary. angleY ranges from -90 degrees (skew to // the bottom) to 90 degrees (skew to the top). +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformSkewY(angleY, x, y float64) { f.TransformSkew(0, angleY, x, y) } @@ -143,6 +169,8 @@ func (f *Fpdf) TransformSkewY(angleY, x, y float64) { // keeping the point (x, y) stationary. angleX ranges from -90 degrees (skew to // the left) to 90 degrees (skew to the right). angleY ranges from -90 degrees // (skew to the bottom) to 90 degrees (skew to the top). +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformSkew(angleX, angleY, x, y float64) { if angleX <= -90 || angleX >= 90 || angleY <= -90 || angleY >= 90 { f.err = fmt.Errorf("skew values must be between -90° and 90°") @@ -173,6 +201,8 @@ func (f *Fpdf) Transform(tm TransformMatrix) { } // TransformEnd applies a transformation that was begun with a call to TransformBegin(). +// +// The TransformBegin() example demonstrates this method. func (f *Fpdf) TransformEnd() { if f.transformNest > 0 { f.transformNest-- diff --git a/htmlbasic.go b/htmlbasic.go index b7186bc..e602b7d 100644 --- a/htmlbasic.go +++ b/htmlbasic.go @@ -106,8 +106,6 @@ type HTMLBasicType struct { // HTMLBasicNew returns an instance that facilitates writing basic HTML in the // specified PDF file. -// -// This function is demonstrated in tutorial 6. func (f *Fpdf) HTMLBasicNew() (html HTMLBasicType) { html.pdf = f html.Link.ClrR, html.Link.ClrG, html.Link.ClrB = 0, 0, 128 @@ -42,8 +42,6 @@ func (f *Fpdf) layerInit() { // display in the layer list. visible specifies whether the layer will be // initially visible. The return value is an integer ID that is used in a call // to BeginLayer(). -// -// Layers are demonstrated in tutorial 26. func (f *Fpdf) AddLayer(name string, visible bool) (layerID int) { layerID = len(f.layer.list) f.layer.list = append(f.layer.list, layerType{name: name, visible: visible}) diff --git a/svgbasic.go b/svgbasic.go index 749933e..cb8e91e 100644 --- a/svgbasic.go +++ b/svgbasic.go @@ -199,8 +199,7 @@ func SVGBasicParse(buf []byte) (sig SVGBasicType, err error) { } // SVGBasicFileParse parses a simple scalable vector graphics (SVG) file into a -// basic descriptor. See SVGBasicParse for additional comments and tutorial 20 -// for an example of this function. +// basic descriptor. The SVGBasicWrite() example demonstrates this method. func SVGBasicFileParse(svgFileStr string) (sig SVGBasicType, err error) { var buf []byte buf, err = ioutil.ReadFile(svgFileStr) @@ -260,7 +260,7 @@ func UnicodeTranslatorFromFile(fileStr string) (f func(string) string, err error // If an error occurs reading the descriptor, the returned function is valid // but does not perform any rune translation. // -// See tutorial 23 for an example of this function. +// The CellFormat (4) example demonstrates this method. func (f *Fpdf) UnicodeTranslatorFromDescriptor(cpStr string) (rep func(string) string) { var str string var ok bool |