123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- /*
- Package gofpdf implements a PDF document generator with high level
- support for text, drawing and images.
- Features
- - UTF-8 support
- - Choice of measurement unit, page format and margins
- - Page header and footer management
- - Automatic page breaks, line breaks, and text justification
- - Inclusion of JPEG, PNG, GIF, TIFF and basic path-only SVG images
- - Colors, gradients and alpha channel transparency
- - Outline bookmarks
- - Internal and external links
- - TrueType, Type1 and encoding support
- - Page compression
- - Lines, Bézier curves, arcs, and ellipses
- - Rotation, scaling, skewing, translation, and mirroring
- - Clipping
- - Document protection
- - Layers
- - Templates
- - Barcodes
- - Charting facility
- - Import PDFs as templates
- gofpdf has no dependencies other than the Go standard library. All tests
- pass on Linux, Mac and Windows platforms.
- gofpdf supports UTF-8 TrueType fonts and “right-to-left” languages. Note
- that Chinese, Japanese, and Korean characters may not be included in
- many general purpose fonts. For these languages, a specialized font (for
- example, NotoSansSC for simplified Chinese) can be used.
- Also, support is provided to automatically translate UTF-8 runes to code
- page encodings for languages that have fewer than 256 glyphs.
- We Are Closed
- This repository will not be maintained, at least for some unknown
- duration. But it is hoped that gofpdf has a bright future in the open
- source world. Due to Go’s promise of compatibility, gofpdf should
- continue to function without modification for a longer time than would
- be the case with many other languages.
- Forks should be based on the last viable commit. Tools such as
- active-forks can be used to select a fork that looks promising for your
- needs. If a particular fork looks like it has taken the lead in
- attracting followers, this README will be updated to point people in
- that direction.
- The efforts of all contributors to this project have been deeply
- appreciated. Best wishes to all of you.
- Installation
- To install the package on your system, run
- go get github.com/jung-kurt/gofpdf
- Later, to receive updates, run
- go get -u -v github.com/jung-kurt/gofpdf/...
- Quick Start
- The following Go code generates a simple PDF file.
- pdf := gofpdf.New("P", "mm", "A4", "")
- pdf.AddPage()
- pdf.SetFont("Arial", "B", 16)
- pdf.Cell(40, 10, "Hello, world")
- err := pdf.OutputFileAndClose("hello.pdf")
- See the functions in the fpdf_test.go file (shown as examples in this
- documentation) for more advanced PDF examples.
- Errors
- If an error occurs in an Fpdf method, an internal error field is set.
- After this occurs, Fpdf method calls typically return without performing
- any operations and the error state is retained. This error management
- scheme facilitates PDF generation since individual method calls do not
- need to be examined for failure; it is generally sufficient to wait
- until after Output() is called. For the same reason, if an error occurs
- in the calling application during PDF generation, it may be desirable
- for the application to transfer the error to the Fpdf instance by
- calling the SetError() method or the SetErrorf() method. At any time
- during the life cycle of the Fpdf instance, the error state can be
- determined with a call to Ok() or Err(). The error itself can be
- retrieved with a call to Error().
- Conversion Notes
- This package is a relatively straightforward translation from the
- original FPDF library written in PHP (despite the caveat in the
- introduction to Effective Go). The API names have been retained even
- though the Go idiom would suggest otherwise (for example, pdf.GetX() is
- used rather than simply pdf.X()). The similarity of the two libraries
- makes the original FPDF website a good source of information. It
- includes a forum and FAQ.
- However, some internal changes have been made. Page content is built up
- using buffers (of type bytes.Buffer) rather than repeated string
- concatenation. Errors are handled as explained above rather than
- panicking. Output is generated through an interface of type io.Writer or
- io.WriteCloser. A number of the original PHP methods behave differently
- based on the type of the arguments 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.
- 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.
- 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 exampleFilename() and
- summary().
- Example PDFs can be compared with reference copies in order to verify
- that they have been generated as expected. This comparison will be
- performed if a PDF with the same name as the example PDF is placed in
- the gofpdf/pdf/reference directory and if the third argument to
- ComparePDFFiles() in internal/example/example.go is true. (By default it
- is false.) The routine that summarizes an example will look for this
- file and, if found, will call ComparePDFFiles() to check the example PDF
- for equality with its reference PDF. If differences exist between the
- two files they will be printed to standard output and the test will
- fail. If the reference file is missing, the comparison is considered to
- succeed. In order to successfully compare two PDFs, the placement of
- internal resources must be consistent and the internal creation
- timestamps must be the same. To do this, the methods SetCatalogSort()
- and SetCreationDate() need to be called for both files. This is done
- automatically for all examples.
- Nonstandard Fonts
- Nothing special is required to use the standard PDF fonts (courier,
- helvetica, times, zapfdingbats) in your documents other than calling
- SetFont().
- You should use AddUTF8Font() or AddUTF8FontFromBytes() to add a TrueType
- UTF-8 encoded font. Use RTL() and LTR() methods switch between
- “right-to-left” and “left-to-right” mode.
- In order to use a different non-UTF-8 TrueType or Type1 font, you will
- need to generate a font definition file and, if the font will be
- embedded into PDFs, a compressed version of the font file. This is done
- by calling the MakeFont function or using the included makefont command
- line utility. To create the utility, cd into the makefont subdirectory
- and run “go build”. This will produce a standalone executable named
- makefont. Select the appropriate encoding file from 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. Most examples,
- including the package example, demonstrate this method. Good sources of
- free, open-source fonts include Google Fonts and DejaVu Fonts.
- Related Packages
- The draw2d package is a two dimensional vector graphics library that can
- generate output in different forms. It uses gofpdf for its document
- production mode.
- 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. A contribution
- that does not directly pertain to the core functionality of gofpdf
- should be placed in its 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
- - be formatted with go fmt
- - include an example in fpdf_test.go if appropriate
- - conform to the standards of golint and go vet, that is, golint . and
- go vet . should not generate any warnings
- - not diminish test coverage
- Pull requests are the preferred means of accepting your changes.
- License
- gofpdf is released under the MIT License. It is copyrighted by Kurt Jung
- and the contributors acknowledged below.
- Acknowledgments
- This package’s code and documentation are closely derived from the FPDF
- library created by Olivier Plathey, and a number of font and image
- resources are copied directly from it. Bruno Michel has provided
- valuable assistance with the code. Drawing support is adapted from the
- FPDF geometric figures script by David Hernández Sanz. Transparency
- support is adapted from the FPDF transparency script by Martin Hall-May.
- Support for gradients and clipping is adapted from FPDF scripts by
- Andreas Würmser. Support for outline bookmarks is adapted from Olivier
- Plathey by Manuel Cornes. Layer support is adapted from Olivier Plathey.
- Support for transformations is adapted from the FPDF transformation
- script by Moritz Wagner and Andreas Würmser. PDF protection is adapted
- from the work of Klemen Vodopivec for the FPDF product. Lawrence
- Kesteloot provided code to allow an image’s extent to be determined
- prior to placement. Support for vertical alignment within a cell was
- provided by Stefan Schroeder. Ivan Daniluk generalized the font and
- image loading code to use the Reader interface while maintaining
- backward compatibility. Anthony Starks provided code for the Polygon
- function. Robert Lillack provided the Beziergon function and corrected
- some naming issues with the internal curve function. Claudio Felber
- provided implementations for dashed line drawing and generalized font
- loading. Stani Michiels provided support for multi-segment path drawing
- with smooth line joins, line join styles, enhanced fill modes, and has
- helped greatly with package presentation and tests. Templating is
- adapted by Marcus Downing from the FPDF_Tpl library created by Jan
- Slabon and Setasign. Jelmer Snoeck contributed packages that generate a
- variety of barcodes and help with registering images on the web. Jelmer
- Snoek and Guillermo Pascual augmented the basic HTML functionality with
- aligned text. Kent Quirk implemented backwards-compatible support for
- reading DPI from images that support it, and for setting DPI manually
- and then having it properly taken into account when calculating image
- size. Paulo Coutinho provided support for static embedded fonts. Dan
- Meyers added support for embedded JavaScript. David Fish added a generic
- alias-replacement function to enable, among other things, table of
- contents functionality. Andy Bakun identified and corrected a problem in
- which the internal catalogs were not sorted stably. Paul Montag added
- encoding and decoding functionality for templates, including images that
- are embedded in templates; this allows templates to be stored
- independently of gofpdf. Paul also added support for page boxes used in
- printing PDF documents. Wojciech Matusiak added supported for word
- spacing. Artem Korotkiy added support of UTF-8 fonts. Dave Barnes added
- support for imported objects and templates. Brigham Thompson added
- support for rounded rectangles. Joe Westcott added underline
- functionality and optimized image storage. Benoit KUGLER contributed
- support for rectangles with corners of unequal radius, modification
- times, and for file attachments and annotations.
- Roadmap
- - Remove all legacy code page font support; use UTF-8 exclusively
- - Improve test coverage as reported by the coverage tool.
- */
- package gofpdf
|