123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738 |
- /*
- * Copyright (c) 2013-2014 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 gofpdf
- import (
- "bytes"
- "crypto/sha1"
- "encoding/gob"
- "encoding/json"
- "fmt"
- "io"
- "time"
- )
- // Version of FPDF from which this package is derived
- const (
- cnFpdfVersion = "1.7"
- )
- type blendModeType struct {
- strokeStr, fillStr, modeStr string
- objNum int
- }
- type gradientType struct {
- tp int // 2: linear, 3: radial
- clr1Str, clr2Str string
- x1, y1, x2, y2, r float64
- objNum int
- }
- const (
- // OrientationPortrait represents the portrait orientation.
- OrientationPortrait = "portrait"
- // OrientationLandscape represents the landscape orientation.
- OrientationLandscape = "landscape"
- )
- const (
- // UnitPoint represents the size unit point
- UnitPoint = "pt"
- // UnitMillimeter represents the size unit millimeter
- UnitMillimeter = "mm"
- // UnitCentimeter represents the size unit centimeter
- UnitCentimeter = "cm"
- // UnitInch represents the size unit inch
- UnitInch = "inch"
- )
- const (
- // PageSizeA3 represents DIN/ISO A3 page size
- PageSizeA3 = "A3"
- // PageSizeA4 represents DIN/ISO A4 page size
- PageSizeA4 = "A4"
- // PageSizeA5 represents DIN/ISO A5 page size
- PageSizeA5 = "A5"
- // PageSizeLetter represents US Letter page size
- PageSizeLetter = "Letter"
- // PageSizeLegal represents US Legal page size
- PageSizeLegal = "Legal"
- )
- const (
- // BorderNone set no border
- BorderNone = ""
- // BorderFull sets a full border
- BorderFull = "1"
- // BorderLeft sets the border on the left side
- BorderLeft = "L"
- // BorderTop sets the border at the top
- BorderTop = "T"
- // BorderRight sets the border on the right side
- BorderRight = "R"
- // BorderBottom sets the border on the bottom
- BorderBottom = "B"
- )
- const (
- // LineBreakNone disables linebreak
- LineBreakNone = 0
- // LineBreakNormal enables normal linebreak
- LineBreakNormal = 1
- // LineBreakBelow enables linebreak below
- LineBreakBelow = 2
- )
- const (
- // AlignLeft left aligns the cell
- AlignLeft = "L"
- // AlignRight right aligns the cell
- AlignRight = "R"
- // AlignCenter centers the cell
- AlignCenter = "C"
- // AlignTop aligns the cell to the top
- AlignTop = "T"
- // AlignBottom aligns the cell to the bottom
- AlignBottom = "B"
- // AlignMiddle aligns the cell to the middle
- AlignMiddle = "M"
- // AlignBaseline aligns the cell to the baseline
- AlignBaseline = "B"
- )
- type colorMode int
- const (
- colorModeRGB colorMode = iota
- colorModeSpot
- colorModeCMYK
- )
- type colorType struct {
- r, g, b float64
- ir, ig, ib int
- mode colorMode
- spotStr string // name of current spot color
- gray bool
- str string
- }
- // SpotColorType specifies a named spot color value
- type spotColorType struct {
- id, objID int
- val cmykColorType
- }
- // CMYKColorType specifies an ink-based CMYK color value
- type cmykColorType struct {
- c, m, y, k byte // 0% to 100%
- }
- // SizeType fields Wd and Ht specify the horizontal and vertical extents of a
- // document element such as a page.
- type SizeType struct {
- Wd, Ht float64
- }
- // PointType fields X and Y specify the horizontal and vertical coordinates of
- // a point, typically used in drawing.
- type PointType struct {
- X, Y float64
- }
- // XY returns the X and Y components of the receiver point.
- func (p PointType) XY() (float64, float64) {
- return p.X, p.Y
- }
- // ImageInfoType contains size, color and other information about an image.
- // Changes to this structure should be reflected in its GobEncode and GobDecode
- // methods.
- type ImageInfoType struct {
- data []byte // Raw image data
- smask []byte // Soft Mask, an 8bit per-pixel transparency mask
- n int // Image object number
- w float64 // Width
- h float64 // Height
- cs string // Color space
- pal []byte // Image color palette
- bpc int // Bits Per Component
- f string // Image filter
- dp string // DecodeParms
- trns []int // Transparency mask
- scale float64 // Document scale factor
- dpi float64 // Dots-per-inch found from image file (png only)
- i string // SHA-1 checksum of the above values.
- }
- func generateImageID(info *ImageInfoType) (string, error) {
- b, err := info.GobEncode()
- return fmt.Sprintf("%x", sha1.Sum(b)), err
- }
- // GobEncode encodes the receiving image to a byte slice.
- func (info *ImageInfoType) GobEncode() (buf []byte, err error) {
- fields := []interface{}{info.data, info.smask, info.n, info.w, info.h, info.cs,
- info.pal, info.bpc, info.f, info.dp, info.trns, info.scale, info.dpi}
- w := new(bytes.Buffer)
- encoder := gob.NewEncoder(w)
- for j := 0; j < len(fields) && err == nil; j++ {
- err = encoder.Encode(fields[j])
- }
- if err == nil {
- buf = w.Bytes()
- }
- return
- }
- // GobDecode decodes the specified byte buffer (generated by GobEncode) into
- // the receiving image.
- func (info *ImageInfoType) GobDecode(buf []byte) (err error) {
- fields := []interface{}{&info.data, &info.smask, &info.n, &info.w, &info.h,
- &info.cs, &info.pal, &info.bpc, &info.f, &info.dp, &info.trns, &info.scale, &info.dpi}
- r := bytes.NewBuffer(buf)
- decoder := gob.NewDecoder(r)
- for j := 0; j < len(fields) && err == nil; j++ {
- err = decoder.Decode(fields[j])
- }
- info.i, err = generateImageID(info)
- return
- }
- // PointConvert returns the value of pt, expressed in points (1/72 inch), as a
- // value expressed in the unit of measure specified in New(). Since font
- // management in Fpdf uses points, this method can help with line height
- // calculations and other methods that require user units.
- func (f *Fpdf) PointConvert(pt float64) (u float64) {
- return pt / f.k
- }
- // PointToUnitConvert is an alias for PointConvert.
- func (f *Fpdf) PointToUnitConvert(pt float64) (u float64) {
- return pt / f.k
- }
- // UnitToPointConvert returns the value of u, expressed in the unit of measure
- // specified in New(), as a value expressed in points (1/72 inch). Since font
- // management in Fpdf uses points, this method can help with setting font sizes
- // based on the sizes of other non-font page elements.
- func (f *Fpdf) UnitToPointConvert(u float64) (pt float64) {
- return u * f.k
- }
- // Extent returns the width and height of the image in the units of the Fpdf
- // object.
- func (info *ImageInfoType) Extent() (wd, ht float64) {
- return info.Width(), info.Height()
- }
- // Width returns the width of the image in the units of the Fpdf object.
- func (info *ImageInfoType) Width() float64 {
- return info.w / (info.scale * info.dpi / 72)
- }
- // Height returns the height of the image in the units of the Fpdf object.
- func (info *ImageInfoType) Height() float64 {
- return info.h / (info.scale * info.dpi / 72)
- }
- // SetDpi sets the dots per inch for an image. PNG images MAY have their dpi
- // set automatically, if the image specifies it. DPI information is not
- // currently available automatically for JPG and GIF images, so if it's
- // important to you, you can set it here. It defaults to 72 dpi.
- func (info *ImageInfoType) SetDpi(dpi float64) {
- info.dpi = dpi
- }
- type fontFileType struct {
- length1, length2 int64
- n int
- embedded bool
- content []byte
- fontType string
- }
- type linkType struct {
- x, y, wd, ht float64
- link int // Auto-generated internal link ID or...
- linkStr string // ...application-provided external link string
- }
- type intLinkType struct {
- page int
- y float64
- }
- // outlineType is used for a sidebar outline of bookmarks
- type outlineType struct {
- text string
- level, parent, first, last, next, prev int
- y float64
- p int
- }
- // InitType is used with NewCustom() to customize an Fpdf instance.
- // OrientationStr, UnitStr, SizeStr and FontDirStr correspond to the arguments
- // accepted by New(). If the Wd and Ht fields of Size are each greater than
- // zero, Size will be used to set the default page size rather than SizeStr. Wd
- // and Ht are specified in the units of measure indicated by UnitStr.
- type InitType struct {
- OrientationStr string
- UnitStr string
- SizeStr string
- Size SizeType
- FontDirStr string
- }
- // FontLoader is used to read fonts (JSON font specification and zlib compressed font binaries)
- // from arbitrary locations (e.g. files, zip files, embedded font resources).
- //
- // Open provides an io.Reader for the specified font file (.json or .z). The file name
- // never includes a path. Open returns an error if the specified file cannot be opened.
- type FontLoader interface {
- Open(name string) (io.Reader, error)
- }
- // Pdf defines the interface used for various methods. It is implemented by the
- // main FPDF instance as well as templates.
- type Pdf interface {
- AddFont(familyStr, styleStr, fileStr string)
- AddFontFromBytes(familyStr, styleStr string, jsonFileBytes, zFileBytes []byte)
- AddFontFromReader(familyStr, styleStr string, r io.Reader)
- AddLayer(name string, visible bool) (layerID int)
- AddLink() int
- AddPage()
- AddPageFormat(orientationStr string, size SizeType)
- AddSpotColor(nameStr string, c, m, y, k byte)
- AliasNbPages(aliasStr string)
- ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64)
- Arc(x, y, rx, ry, degRotate, degStart, degEnd float64, styleStr string)
- BeginLayer(id int)
- Beziergon(points []PointType, styleStr string)
- Bookmark(txtStr string, level int, y float64)
- CellFormat(w, h float64, txtStr, borderStr string, ln int, alignStr string, fill bool, link int, linkStr string)
- Cellf(w, h float64, fmtStr string, args ...interface{})
- Cell(w, h float64, txtStr string)
- Circle(x, y, r float64, styleStr string)
- ClearError()
- ClipCircle(x, y, r float64, outline bool)
- ClipEllipse(x, y, rx, ry float64, outline bool)
- ClipEnd()
- ClipPolygon(points []PointType, outline bool)
- ClipRect(x, y, w, h float64, outline bool)
- ClipRoundedRect(x, y, w, h, r float64, outline bool)
- ClipText(x, y float64, txtStr string, outline bool)
- Close()
- ClosePath()
- CreateTemplateCustom(corner PointType, size SizeType, fn func(*Tpl)) Template
- CreateTemplate(fn func(*Tpl)) Template
- CurveBezierCubicTo(cx0, cy0, cx1, cy1, x, y float64)
- CurveBezierCubic(x0, y0, cx0, cy0, cx1, cy1, x1, y1 float64, styleStr string)
- CurveCubic(x0, y0, cx0, cy0, x1, y1, cx1, cy1 float64, styleStr string)
- CurveTo(cx, cy, x, y float64)
- Curve(x0, y0, cx, cy, x1, y1 float64, styleStr string)
- DrawPath(styleStr string)
- Ellipse(x, y, rx, ry, degRotate float64, styleStr string)
- EndLayer()
- Err() bool
- Error() error
- GetAlpha() (alpha float64, blendModeStr string)
- GetAutoPageBreak() (auto bool, margin float64)
- GetCellMargin() float64
- GetConversionRatio() float64
- GetDrawColor() (int, int, int)
- GetDrawSpotColor() (name string, c, m, y, k byte)
- GetFillColor() (int, int, int)
- GetFillSpotColor() (name string, c, m, y, k byte)
- GetFontDesc(familyStr, styleStr string) FontDescType
- GetFontSize() (ptSize, unitSize float64)
- GetImageInfo(imageStr string) (info *ImageInfoType)
- GetLineWidth() float64
- GetMargins() (left, top, right, bottom float64)
- GetPageSizeStr(sizeStr string) (size SizeType)
- GetPageSize() (width, height float64)
- GetStringWidth(s string) float64
- GetTextColor() (int, int, int)
- GetTextSpotColor() (name string, c, m, y, k byte)
- GetX() float64
- GetXY() (float64, float64)
- GetY() float64
- HTMLBasicNew() (html HTMLBasicType)
- Image(imageNameStr string, x, y, w, h float64, flow bool, tp string, link int, linkStr string)
- ImageOptions(imageNameStr string, x, y, w, h float64, flow bool, options ImageOptions, link int, linkStr string)
- ImageTypeFromMime(mimeStr string) (tp string)
- LinearGradient(x, y, w, h float64, r1, g1, b1, r2, g2, b2 int, x1, y1, x2, y2 float64)
- LineTo(x, y float64)
- Line(x1, y1, x2, y2 float64)
- LinkString(x, y, w, h float64, linkStr string)
- Link(x, y, w, h float64, link int)
- Ln(h float64)
- MoveTo(x, y float64)
- MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill bool)
- Ok() bool
- OpenLayerPane()
- OutputAndClose(w io.WriteCloser) error
- OutputFileAndClose(fileStr string) error
- Output(w io.Writer) error
- PageCount() int
- PageNo() int
- PageSize(pageNum int) (wd, ht float64, unitStr string)
- PointConvert(pt float64) (u float64)
- PointToUnitConvert(pt float64) (u float64)
- Polygon(points []PointType, styleStr string)
- RadialGradient(x, y, w, h float64, r1, g1, b1, r2, g2, b2 int, x1, y1, x2, y2, r float64)
- RawWriteBuf(r io.Reader)
- RawWriteStr(str string)
- Rect(x, y, w, h float64, styleStr string)
- RegisterAlias(alias, replacement string)
- RegisterImage(fileStr, tp string) (info *ImageInfoType)
- RegisterImageOptions(fileStr string, options ImageOptions) (info *ImageInfoType)
- RegisterImageOptionsReader(imgName string, options ImageOptions, r io.Reader) (info *ImageInfoType)
- RegisterImageReader(imgName, tp string, r io.Reader) (info *ImageInfoType)
- SetAcceptPageBreakFunc(fnc func() bool)
- SetAlpha(alpha float64, blendModeStr string)
- SetAuthor(authorStr string, isUTF8 bool)
- SetAutoPageBreak(auto bool, margin float64)
- SetCatalogSort(flag bool)
- SetCellMargin(margin float64)
- SetCompression(compress bool)
- SetCreationDate(tm time.Time)
- SetCreator(creatorStr string, isUTF8 bool)
- SetDashPattern(dashArray []float64, dashPhase float64)
- SetDisplayMode(zoomStr, layoutStr string)
- SetDrawColor(r, g, b int)
- SetDrawSpotColor(nameStr string, tint byte)
- SetError(err error)
- SetErrorf(fmtStr string, args ...interface{})
- SetFillColor(r, g, b int)
- SetFillSpotColor(nameStr string, tint byte)
- SetFont(familyStr, styleStr string, size float64)
- SetFontLoader(loader FontLoader)
- SetFontLocation(fontDirStr string)
- SetFontSize(size float64)
- SetFontStyle(styleStr string)
- SetFontUnitSize(size float64)
- SetFooterFunc(fnc func())
- SetFooterFuncLpi(fnc func(lastPage bool))
- SetHeaderFunc(fnc func())
- SetHeaderFuncMode(fnc func(), homeMode bool)
- SetHomeXY()
- SetJavascript(script string)
- SetKeywords(keywordsStr string, isUTF8 bool)
- SetLeftMargin(margin float64)
- SetLineCapStyle(styleStr string)
- SetLineJoinStyle(styleStr string)
- SetLineWidth(width float64)
- SetLink(link int, y float64, page int)
- SetMargins(left, top, right float64)
- SetPageBoxRec(t string, pb PageBox)
- SetPageBox(t string, x, y, wd, ht float64)
- SetPage(pageNum int)
- SetProtection(actionFlag byte, userPassStr, ownerPassStr string)
- SetRightMargin(margin float64)
- SetSubject(subjectStr string, isUTF8 bool)
- SetTextColor(r, g, b int)
- SetTextSpotColor(nameStr string, tint byte)
- SetTitle(titleStr string, isUTF8 bool)
- SetTopMargin(margin float64)
- SetUnderlineThickness(thickness float64)
- SetXmpMetadata(xmpStream []byte)
- SetX(x float64)
- SetXY(x, y float64)
- SetY(y float64)
- SplitLines(txt []byte, w float64) [][]byte
- String() string
- SVGBasicWrite(sb *SVGBasicType, scale float64)
- Text(x, y float64, txtStr string)
- TransformBegin()
- TransformEnd()
- TransformMirrorHorizontal(x float64)
- TransformMirrorLine(angle, x, y float64)
- TransformMirrorPoint(x, y float64)
- TransformMirrorVertical(y float64)
- TransformRotate(angle, x, y float64)
- TransformScale(scaleWd, scaleHt, x, y float64)
- TransformScaleX(scaleWd, x, y float64)
- TransformScaleXY(s, x, y float64)
- TransformScaleY(scaleHt, x, y float64)
- TransformSkew(angleX, angleY, x, y float64)
- TransformSkewX(angleX, x, y float64)
- TransformSkewY(angleY, x, y float64)
- Transform(tm TransformMatrix)
- TransformTranslate(tx, ty float64)
- TransformTranslateX(tx float64)
- TransformTranslateY(ty float64)
- UnicodeTranslatorFromDescriptor(cpStr string) (rep func(string) string)
- UnitToPointConvert(u float64) (pt float64)
- UseTemplateScaled(t Template, corner PointType, size SizeType)
- UseTemplate(t Template)
- WriteAligned(width, lineHeight float64, textStr, alignStr string)
- Writef(h float64, fmtStr string, args ...interface{})
- Write(h float64, txtStr string)
- WriteLinkID(h float64, displayStr string, linkID int)
- WriteLinkString(h float64, displayStr, targetStr string)
- }
- // PageBox defines the coordinates and extent of the various page box types
- type PageBox struct {
- SizeType
- PointType
- }
- // Fpdf is the principal structure for creating a single PDF document
- type Fpdf struct {
- isCurrentUTF8 bool // is current font used in utf-8 mode
- isRTL bool // is is right to left mode enabled
- page int // current page number
- n int // current object number
- offsets []int // array of object offsets
- templates map[string]Template // templates used in this document
- templateObjects map[string]int // template object IDs within this document
- importedObjs map[string][]byte // imported template objects (gofpdi)
- importedObjPos map[string]map[int]string // imported template objects hashes and their positions (gofpdi)
- importedTplObjs map[string]string // imported template names and IDs (hashed) (gofpdi)
- importedTplIDs map[string]int // imported template ids hash to object id int (gofpdi)
- buffer fmtBuffer // buffer holding in-memory PDF
- pages []*bytes.Buffer // slice[page] of page content; 1-based
- state int // current document state
- compress bool // compression flag
- k float64 // scale factor (number of points in user unit)
- defOrientation string // default orientation
- curOrientation string // current orientation
- stdPageSizes map[string]SizeType // standard page sizes
- defPageSize SizeType // default page size
- defPageBoxes map[string]PageBox // default page size
- curPageSize SizeType // current page size
- pageSizes map[int]SizeType // used for pages with non default sizes or orientations
- pageBoxes map[int]map[string]PageBox // used to define the crop, trim, bleed and art boxes
- unitStr string // unit of measure for all rendered objects except fonts
- wPt, hPt float64 // dimensions of current page in points
- w, h float64 // dimensions of current page in user unit
- lMargin float64 // left margin
- tMargin float64 // top margin
- rMargin float64 // right margin
- bMargin float64 // page break margin
- cMargin float64 // cell margin
- x, y float64 // current position in user unit
- lasth float64 // height of last printed cell
- lineWidth float64 // line width in user unit
- fontpath string // path containing fonts
- fontLoader FontLoader // used to load font files from arbitrary locations
- coreFonts map[string]bool // array of core font names
- fonts map[string]fontDefType // array of used fonts
- fontFiles map[string]fontFileType // array of font files
- diffs []string // array of encoding differences
- fontFamily string // current font family
- fontStyle string // current font style
- underline bool // underlining flag
- strikeout bool // strike out flag
- currentFont fontDefType // current font info
- fontSizePt float64 // current font size in points
- fontSize float64 // current font size in user unit
- ws float64 // word spacing
- images map[string]*ImageInfoType // array of used images
- aliasMap map[string]string // map of alias->replacement
- pageLinks [][]linkType // pageLinks[page][link], both 1-based
- links []intLinkType // array of internal links
- attachments []Attachment // slice of content to embed globally
- pageAttachments [][]annotationAttach // 1-based array of annotation for file attachments (per page)
- outlines []outlineType // array of outlines
- outlineRoot int // root of outlines
- autoPageBreak bool // automatic page breaking
- acceptPageBreak func() bool // returns true to accept page break
- pageBreakTrigger float64 // threshold used to trigger page breaks
- inHeader bool // flag set when processing header
- headerFnc func() // function provided by app and called to write header
- headerHomeMode bool // set position to home after headerFnc is called
- inFooter bool // flag set when processing footer
- footerFnc func() // function provided by app and called to write footer
- footerFncLpi func(bool) // function provided by app and called to write footer with last page flag
- zoomMode string // zoom display mode
- layoutMode string // layout display mode
- xmp []byte // XMP metadata
- producer string // producer
- title string // title
- subject string // subject
- author string // author
- keywords string // keywords
- creator string // creator
- creationDate time.Time // override for document CreationDate value
- modDate time.Time // override for document ModDate value
- aliasNbPagesStr string // alias for total number of pages
- pdfVersion string // PDF version number
- fontDirStr string // location of font definition files
- capStyle int // line cap style: butt 0, round 1, square 2
- joinStyle int // line segment join style: miter 0, round 1, bevel 2
- dashArray []float64 // dash array
- dashPhase float64 // dash phase
- blendList []blendModeType // slice[idx] of alpha transparency modes, 1-based
- blendMap map[string]int // map into blendList
- blendMode string // current blend mode
- alpha float64 // current transpacency
- gradientList []gradientType // slice[idx] of gradient records
- clipNest int // Number of active clipping contexts
- transformNest int // Number of active transformation contexts
- err error // Set if error occurs during life cycle of instance
- protect protectType // document protection structure
- layer layerRecType // manages optional layers in document
- catalogSort bool // sort resource catalogs in document
- nJs int // JavaScript object number
- javascript *string // JavaScript code to include in the PDF
- colorFlag bool // indicates whether fill and text colors are different
- color struct {
- // Composite values of colors
- draw, fill, text colorType
- }
- spotColorMap map[string]spotColorType // Map of named ink-based colors
- userUnderlineThickness float64 // A custom user underline thickness multiplier.
- }
- type encType struct {
- uv int
- name string
- }
- type encListType [256]encType
- type fontBoxType struct {
- Xmin, Ymin, Xmax, Ymax int
- }
- // Font flags for FontDescType.Flags as defined in the pdf specification.
- const (
- // FontFlagFixedPitch is set if all glyphs have the same width (as
- // opposed to proportional or variable-pitch fonts, which have
- // different widths).
- FontFlagFixedPitch = 1 << 0
- // FontFlagSerif is set if glyphs have serifs, which are short
- // strokes drawn at an angle on the top and bottom of glyph stems.
- // (Sans serif fonts do not have serifs.)
- FontFlagSerif = 1 << 1
- // FontFlagSymbolic is set if font contains glyphs outside the
- // Adobe standard Latin character set. This flag and the
- // Nonsymbolic flag shall not both be set or both be clear.
- FontFlagSymbolic = 1 << 2
- // FontFlagScript is set if glyphs resemble cursive handwriting.
- FontFlagScript = 1 << 3
- // FontFlagNonsymbolic is set if font uses the Adobe standard
- // Latin character set or a subset of it.
- FontFlagNonsymbolic = 1 << 5
- // FontFlagItalic is set if glyphs have dominant vertical strokes
- // that are slanted.
- FontFlagItalic = 1 << 6
- // FontFlagAllCap is set if font contains no lowercase letters;
- // typically used for display purposes, such as for titles or
- // headlines.
- FontFlagAllCap = 1 << 16
- // SmallCap is set if font contains both uppercase and lowercase
- // letters. The uppercase letters are similar to those in the
- // regular version of the same typeface family. The glyphs for the
- // lowercase letters have the same shapes as the corresponding
- // uppercase letters, but they are sized and their proportions
- // adjusted so that they have the same size and stroke weight as
- // lowercase glyphs in the same typeface family.
- SmallCap = 1 << 18
- // ForceBold determines whether bold glyphs shall be painted with
- // extra pixels even at very small text sizes by a conforming
- // reader. If the ForceBold flag is set, features of bold glyphs
- // may be thickened at small text sizes.
- ForceBold = 1 << 18
- )
- // FontDescType (font descriptor) specifies metrics and other
- // attributes of a font, as distinct from the metrics of individual
- // glyphs (as defined in the pdf specification).
- type FontDescType struct {
- // The maximum height above the baseline reached by glyphs in this
- // font (for example for "S"). The height of glyphs for accented
- // characters shall be excluded.
- Ascent int
- // The maximum depth below the baseline reached by glyphs in this
- // font. The value shall be a negative number.
- Descent int
- // The vertical coordinate of the top of flat capital letters,
- // measured from the baseline (for example "H").
- CapHeight int
- // A collection of flags defining various characteristics of the
- // font. (See the FontFlag* constants.)
- Flags int
- // A rectangle, expressed in the glyph coordinate system, that
- // shall specify the font bounding box. This should be the smallest
- // rectangle enclosing the shape that would result if all of the
- // glyphs of the font were placed with their origins coincident
- // and then filled.
- FontBBox fontBoxType
- // The angle, expressed in degrees counterclockwise from the
- // vertical, of the dominant vertical strokes of the font. (The
- // 9-o’clock position is 90 degrees, and the 3-o’clock position
- // is –90 degrees.) The value shall be negative for fonts that
- // slope to the right, as almost all italic fonts do.
- ItalicAngle int
- // The thickness, measured horizontally, of the dominant vertical
- // stems of glyphs in the font.
- StemV int
- // The width to use for character codes whose widths are not
- // specified in a font dictionary’s Widths array. This shall have
- // a predictable effect only if all such codes map to glyphs whose
- // actual widths are the same as the value of the MissingWidth
- // entry. (Default value: 0.)
- MissingWidth int
- }
- type fontDefType struct {
- Tp string // "Core", "TrueType", ...
- Name string // "Courier-Bold", ...
- Desc FontDescType // Font descriptor
- Up int // Underline position
- Ut int // Underline thickness
- Cw []int // Character width by ordinal
- Enc string // "cp1252", ...
- Diff string // Differences from reference encoding
- File string // "Redressed.z"
- Size1, Size2 int // Type1 values
- OriginalSize int // Size of uncompressed font file
- N int // Set by font loader
- DiffN int // Position of diff in app array, set by font loader
- i string // 1-based position in font list, set by font loader, not this program
- utf8File *utf8FontFile // UTF-8 font
- usedRunes map[int]int // Array of used runes
- }
- // generateFontID generates a font Id from the font definition
- func generateFontID(fdt fontDefType) (string, error) {
- // file can be different if generated in different instance
- fdt.File = ""
- b, err := json.Marshal(&fdt)
- return fmt.Sprintf("%x", sha1.Sum(b)), err
- }
- type fontInfoType struct {
- Data []byte
- File string
- OriginalSize int
- FontName string
- Bold bool
- IsFixedPitch bool
- UnderlineThickness int
- UnderlinePosition int
- Widths []int
- Size1, Size2 uint32
- Desc FontDescType
- }
|