github.com/phpdave11/gofpdf@v1.4.2/def.go (about) 1 /* 2 * Copyright (c) 2013-2014 Kurt Jung (Gmail: kurt.w.jung) 3 * 4 * Permission to use, copy, modify, and distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 package gofpdf 18 19 import ( 20 "bytes" 21 "crypto/sha1" 22 "encoding/gob" 23 "encoding/json" 24 "fmt" 25 "io" 26 "time" 27 ) 28 29 // Version of FPDF from which this package is derived 30 const ( 31 cnFpdfVersion = "1.7" 32 ) 33 34 type blendModeType struct { 35 strokeStr, fillStr, modeStr string 36 objNum int 37 } 38 39 type gradientType struct { 40 tp int // 2: linear, 3: radial 41 clr1Str, clr2Str string 42 x1, y1, x2, y2, r float64 43 objNum int 44 } 45 46 const ( 47 // OrientationPortrait represents the portrait orientation. 48 OrientationPortrait = "portrait" 49 50 // OrientationLandscape represents the landscape orientation. 51 OrientationLandscape = "landscape" 52 ) 53 54 const ( 55 // UnitPoint represents the size unit point 56 UnitPoint = "pt" 57 // UnitMillimeter represents the size unit millimeter 58 UnitMillimeter = "mm" 59 // UnitCentimeter represents the size unit centimeter 60 UnitCentimeter = "cm" 61 // UnitInch represents the size unit inch 62 UnitInch = "inch" 63 ) 64 65 const ( 66 // PageSizeA3 represents DIN/ISO A3 page size 67 PageSizeA3 = "A3" 68 // PageSizeA4 represents DIN/ISO A4 page size 69 PageSizeA4 = "A4" 70 // PageSizeA5 represents DIN/ISO A5 page size 71 PageSizeA5 = "A5" 72 // PageSizeLetter represents US Letter page size 73 PageSizeLetter = "Letter" 74 // PageSizeLegal represents US Legal page size 75 PageSizeLegal = "Legal" 76 ) 77 78 const ( 79 // BorderNone set no border 80 BorderNone = "" 81 // BorderFull sets a full border 82 BorderFull = "1" 83 // BorderLeft sets the border on the left side 84 BorderLeft = "L" 85 // BorderTop sets the border at the top 86 BorderTop = "T" 87 // BorderRight sets the border on the right side 88 BorderRight = "R" 89 // BorderBottom sets the border on the bottom 90 BorderBottom = "B" 91 ) 92 93 const ( 94 // LineBreakNone disables linebreak 95 LineBreakNone = 0 96 // LineBreakNormal enables normal linebreak 97 LineBreakNormal = 1 98 // LineBreakBelow enables linebreak below 99 LineBreakBelow = 2 100 ) 101 102 const ( 103 // AlignLeft left aligns the cell 104 AlignLeft = "L" 105 // AlignRight right aligns the cell 106 AlignRight = "R" 107 // AlignCenter centers the cell 108 AlignCenter = "C" 109 // AlignTop aligns the cell to the top 110 AlignTop = "T" 111 // AlignBottom aligns the cell to the bottom 112 AlignBottom = "B" 113 // AlignMiddle aligns the cell to the middle 114 AlignMiddle = "M" 115 // AlignBaseline aligns the cell to the baseline 116 AlignBaseline = "B" 117 ) 118 119 type colorMode int 120 121 const ( 122 colorModeRGB colorMode = iota 123 colorModeSpot 124 colorModeCMYK 125 ) 126 127 type colorType struct { 128 r, g, b float64 129 ir, ig, ib int 130 mode colorMode 131 spotStr string // name of current spot color 132 gray bool 133 str string 134 } 135 136 // SpotColorType specifies a named spot color value 137 type spotColorType struct { 138 id, objID int 139 val cmykColorType 140 } 141 142 // CMYKColorType specifies an ink-based CMYK color value 143 type cmykColorType struct { 144 c, m, y, k byte // 0% to 100% 145 } 146 147 // SizeType fields Wd and Ht specify the horizontal and vertical extents of a 148 // document element such as a page. 149 type SizeType struct { 150 Wd, Ht float64 151 } 152 153 // PointType fields X and Y specify the horizontal and vertical coordinates of 154 // a point, typically used in drawing. 155 type PointType struct { 156 X, Y float64 157 } 158 159 // XY returns the X and Y components of the receiver point. 160 func (p PointType) XY() (float64, float64) { 161 return p.X, p.Y 162 } 163 164 // ImageInfoType contains size, color and other information about an image. 165 // Changes to this structure should be reflected in its GobEncode and GobDecode 166 // methods. 167 type ImageInfoType struct { 168 data []byte // Raw image data 169 smask []byte // Soft Mask, an 8bit per-pixel transparency mask 170 n int // Image object number 171 w float64 // Width 172 h float64 // Height 173 cs string // Color space 174 pal []byte // Image color palette 175 bpc int // Bits Per Component 176 f string // Image filter 177 dp string // DecodeParms 178 trns []int // Transparency mask 179 scale float64 // Document scale factor 180 dpi float64 // Dots-per-inch found from image file (png only) 181 i string // SHA-1 checksum of the above values. 182 } 183 184 func generateImageID(info *ImageInfoType) (string, error) { 185 b, err := info.GobEncode() 186 return fmt.Sprintf("%x", sha1.Sum(b)), err 187 } 188 189 // GobEncode encodes the receiving image to a byte slice. 190 func (info *ImageInfoType) GobEncode() (buf []byte, err error) { 191 fields := []interface{}{info.data, info.smask, info.n, info.w, info.h, info.cs, 192 info.pal, info.bpc, info.f, info.dp, info.trns, info.scale, info.dpi} 193 w := new(bytes.Buffer) 194 encoder := gob.NewEncoder(w) 195 for j := 0; j < len(fields) && err == nil; j++ { 196 err = encoder.Encode(fields[j]) 197 } 198 if err == nil { 199 buf = w.Bytes() 200 } 201 return 202 } 203 204 // GobDecode decodes the specified byte buffer (generated by GobEncode) into 205 // the receiving image. 206 func (info *ImageInfoType) GobDecode(buf []byte) (err error) { 207 fields := []interface{}{&info.data, &info.smask, &info.n, &info.w, &info.h, 208 &info.cs, &info.pal, &info.bpc, &info.f, &info.dp, &info.trns, &info.scale, &info.dpi} 209 r := bytes.NewBuffer(buf) 210 decoder := gob.NewDecoder(r) 211 for j := 0; j < len(fields) && err == nil; j++ { 212 err = decoder.Decode(fields[j]) 213 } 214 215 info.i, err = generateImageID(info) 216 return 217 } 218 219 // PointConvert returns the value of pt, expressed in points (1/72 inch), as a 220 // value expressed in the unit of measure specified in New(). Since font 221 // management in Fpdf uses points, this method can help with line height 222 // calculations and other methods that require user units. 223 func (f *Fpdf) PointConvert(pt float64) (u float64) { 224 return pt / f.k 225 } 226 227 // PointToUnitConvert is an alias for PointConvert. 228 func (f *Fpdf) PointToUnitConvert(pt float64) (u float64) { 229 return pt / f.k 230 } 231 232 // UnitToPointConvert returns the value of u, expressed in the unit of measure 233 // specified in New(), as a value expressed in points (1/72 inch). Since font 234 // management in Fpdf uses points, this method can help with setting font sizes 235 // based on the sizes of other non-font page elements. 236 func (f *Fpdf) UnitToPointConvert(u float64) (pt float64) { 237 return u * f.k 238 } 239 240 // Extent returns the width and height of the image in the units of the Fpdf 241 // object. 242 func (info *ImageInfoType) Extent() (wd, ht float64) { 243 return info.Width(), info.Height() 244 } 245 246 // Width returns the width of the image in the units of the Fpdf object. 247 func (info *ImageInfoType) Width() float64 { 248 return info.w / (info.scale * info.dpi / 72) 249 } 250 251 // Height returns the height of the image in the units of the Fpdf object. 252 func (info *ImageInfoType) Height() float64 { 253 return info.h / (info.scale * info.dpi / 72) 254 } 255 256 // SetDpi sets the dots per inch for an image. PNG images MAY have their dpi 257 // set automatically, if the image specifies it. DPI information is not 258 // currently available automatically for JPG and GIF images, so if it's 259 // important to you, you can set it here. It defaults to 72 dpi. 260 func (info *ImageInfoType) SetDpi(dpi float64) { 261 info.dpi = dpi 262 } 263 264 type fontFileType struct { 265 length1, length2 int64 266 n int 267 embedded bool 268 content []byte 269 fontType string 270 } 271 272 type linkType struct { 273 x, y, wd, ht float64 274 link int // Auto-generated internal link ID or... 275 linkStr string // ...application-provided external link string 276 } 277 278 type intLinkType struct { 279 page int 280 y float64 281 } 282 283 // outlineType is used for a sidebar outline of bookmarks 284 type outlineType struct { 285 text string 286 level, parent, first, last, next, prev int 287 y float64 288 p int 289 } 290 291 // InitType is used with NewCustom() to customize an Fpdf instance. 292 // OrientationStr, UnitStr, SizeStr and FontDirStr correspond to the arguments 293 // accepted by New(). If the Wd and Ht fields of Size are each greater than 294 // zero, Size will be used to set the default page size rather than SizeStr. Wd 295 // and Ht are specified in the units of measure indicated by UnitStr. 296 type InitType struct { 297 OrientationStr string 298 UnitStr string 299 SizeStr string 300 Size SizeType 301 FontDirStr string 302 } 303 304 // FontLoader is used to read fonts (JSON font specification and zlib compressed font binaries) 305 // from arbitrary locations (e.g. files, zip files, embedded font resources). 306 // 307 // Open provides an io.Reader for the specified font file (.json or .z). The file name 308 // never includes a path. Open returns an error if the specified file cannot be opened. 309 type FontLoader interface { 310 Open(name string) (io.Reader, error) 311 } 312 313 // Pdf defines the interface used for various methods. It is implemented by the 314 // main FPDF instance as well as templates. 315 type Pdf interface { 316 AddFont(familyStr, styleStr, fileStr string) 317 AddFontFromBytes(familyStr, styleStr string, jsonFileBytes, zFileBytes []byte) 318 AddFontFromReader(familyStr, styleStr string, r io.Reader) 319 AddLayer(name string, visible bool) (layerID int) 320 AddLink() int 321 AddPage() 322 AddPageFormat(orientationStr string, size SizeType) 323 AddSpotColor(nameStr string, c, m, y, k byte) 324 AliasNbPages(aliasStr string) 325 ArcTo(x, y, rx, ry, degRotate, degStart, degEnd float64) 326 Arc(x, y, rx, ry, degRotate, degStart, degEnd float64, styleStr string) 327 BeginLayer(id int) 328 Beziergon(points []PointType, styleStr string) 329 Bookmark(txtStr string, level int, y float64) 330 CellFormat(w, h float64, txtStr, borderStr string, ln int, alignStr string, fill bool, link int, linkStr string) 331 Cellf(w, h float64, fmtStr string, args ...interface{}) 332 Cell(w, h float64, txtStr string) 333 Circle(x, y, r float64, styleStr string) 334 ClearError() 335 ClipCircle(x, y, r float64, outline bool) 336 ClipEllipse(x, y, rx, ry float64, outline bool) 337 ClipEnd() 338 ClipPolygon(points []PointType, outline bool) 339 ClipRect(x, y, w, h float64, outline bool) 340 ClipRoundedRect(x, y, w, h, r float64, outline bool) 341 ClipText(x, y float64, txtStr string, outline bool) 342 Close() 343 ClosePath() 344 CreateTemplateCustom(corner PointType, size SizeType, fn func(*Tpl)) Template 345 CreateTemplate(fn func(*Tpl)) Template 346 CurveBezierCubicTo(cx0, cy0, cx1, cy1, x, y float64) 347 CurveBezierCubic(x0, y0, cx0, cy0, cx1, cy1, x1, y1 float64, styleStr string) 348 CurveCubic(x0, y0, cx0, cy0, x1, y1, cx1, cy1 float64, styleStr string) 349 CurveTo(cx, cy, x, y float64) 350 Curve(x0, y0, cx, cy, x1, y1 float64, styleStr string) 351 DrawPath(styleStr string) 352 Ellipse(x, y, rx, ry, degRotate float64, styleStr string) 353 EndLayer() 354 Err() bool 355 Error() error 356 GetAlpha() (alpha float64, blendModeStr string) 357 GetAutoPageBreak() (auto bool, margin float64) 358 GetCellMargin() float64 359 GetConversionRatio() float64 360 GetDrawColor() (int, int, int) 361 GetDrawSpotColor() (name string, c, m, y, k byte) 362 GetFillColor() (int, int, int) 363 GetFillSpotColor() (name string, c, m, y, k byte) 364 GetFontDesc(familyStr, styleStr string) FontDescType 365 GetFontSize() (ptSize, unitSize float64) 366 GetImageInfo(imageStr string) (info *ImageInfoType) 367 GetLineWidth() float64 368 GetMargins() (left, top, right, bottom float64) 369 GetPageSizeStr(sizeStr string) (size SizeType) 370 GetPageSize() (width, height float64) 371 GetStringWidth(s string) float64 372 GetTextColor() (int, int, int) 373 GetTextSpotColor() (name string, c, m, y, k byte) 374 GetX() float64 375 GetXY() (float64, float64) 376 GetY() float64 377 HTMLBasicNew() (html HTMLBasicType) 378 Image(imageNameStr string, x, y, w, h float64, flow bool, tp string, link int, linkStr string) 379 ImageOptions(imageNameStr string, x, y, w, h float64, flow bool, options ImageOptions, link int, linkStr string) 380 ImageTypeFromMime(mimeStr string) (tp string) 381 LinearGradient(x, y, w, h float64, r1, g1, b1, r2, g2, b2 int, x1, y1, x2, y2 float64) 382 LineTo(x, y float64) 383 Line(x1, y1, x2, y2 float64) 384 LinkString(x, y, w, h float64, linkStr string) 385 Link(x, y, w, h float64, link int) 386 Ln(h float64) 387 MoveTo(x, y float64) 388 MultiCell(w, h float64, txtStr, borderStr, alignStr string, fill bool) 389 Ok() bool 390 OpenLayerPane() 391 OutputAndClose(w io.WriteCloser) error 392 OutputFileAndClose(fileStr string) error 393 Output(w io.Writer) error 394 PageCount() int 395 PageNo() int 396 PageSize(pageNum int) (wd, ht float64, unitStr string) 397 PointConvert(pt float64) (u float64) 398 PointToUnitConvert(pt float64) (u float64) 399 Polygon(points []PointType, styleStr string) 400 RadialGradient(x, y, w, h float64, r1, g1, b1, r2, g2, b2 int, x1, y1, x2, y2, r float64) 401 RawWriteBuf(r io.Reader) 402 RawWriteStr(str string) 403 Rect(x, y, w, h float64, styleStr string) 404 RegisterAlias(alias, replacement string) 405 RegisterImage(fileStr, tp string) (info *ImageInfoType) 406 RegisterImageOptions(fileStr string, options ImageOptions) (info *ImageInfoType) 407 RegisterImageOptionsReader(imgName string, options ImageOptions, r io.Reader) (info *ImageInfoType) 408 RegisterImageReader(imgName, tp string, r io.Reader) (info *ImageInfoType) 409 SetAcceptPageBreakFunc(fnc func() bool) 410 SetAlpha(alpha float64, blendModeStr string) 411 SetAuthor(authorStr string, isUTF8 bool) 412 SetAutoPageBreak(auto bool, margin float64) 413 SetCatalogSort(flag bool) 414 SetCellMargin(margin float64) 415 SetCompression(compress bool) 416 SetCreationDate(tm time.Time) 417 SetCreator(creatorStr string, isUTF8 bool) 418 SetDashPattern(dashArray []float64, dashPhase float64) 419 SetDisplayMode(zoomStr, layoutStr string) 420 SetDrawColor(r, g, b int) 421 SetDrawSpotColor(nameStr string, tint byte) 422 SetError(err error) 423 SetErrorf(fmtStr string, args ...interface{}) 424 SetFillColor(r, g, b int) 425 SetFillSpotColor(nameStr string, tint byte) 426 SetFont(familyStr, styleStr string, size float64) 427 SetFontLoader(loader FontLoader) 428 SetFontLocation(fontDirStr string) 429 SetFontSize(size float64) 430 SetFontStyle(styleStr string) 431 SetFontUnitSize(size float64) 432 SetFooterFunc(fnc func()) 433 SetFooterFuncLpi(fnc func(lastPage bool)) 434 SetHeaderFunc(fnc func()) 435 SetHeaderFuncMode(fnc func(), homeMode bool) 436 SetHomeXY() 437 SetJavascript(script string) 438 SetKeywords(keywordsStr string, isUTF8 bool) 439 SetLeftMargin(margin float64) 440 SetLineCapStyle(styleStr string) 441 SetLineJoinStyle(styleStr string) 442 SetLineWidth(width float64) 443 SetLink(link int, y float64, page int) 444 SetMargins(left, top, right float64) 445 SetPageBoxRec(t string, pb PageBox) 446 SetPageBox(t string, x, y, wd, ht float64) 447 SetPage(pageNum int) 448 SetProtection(actionFlag byte, userPassStr, ownerPassStr string) 449 SetRightMargin(margin float64) 450 SetSubject(subjectStr string, isUTF8 bool) 451 SetTextColor(r, g, b int) 452 SetTextSpotColor(nameStr string, tint byte) 453 SetTitle(titleStr string, isUTF8 bool) 454 SetTopMargin(margin float64) 455 SetUnderlineThickness(thickness float64) 456 SetXmpMetadata(xmpStream []byte) 457 SetX(x float64) 458 SetXY(x, y float64) 459 SetY(y float64) 460 SplitLines(txt []byte, w float64) [][]byte 461 String() string 462 SVGBasicWrite(sb *SVGBasicType, scale float64) 463 Text(x, y float64, txtStr string) 464 TransformBegin() 465 TransformEnd() 466 TransformMirrorHorizontal(x float64) 467 TransformMirrorLine(angle, x, y float64) 468 TransformMirrorPoint(x, y float64) 469 TransformMirrorVertical(y float64) 470 TransformRotate(angle, x, y float64) 471 TransformScale(scaleWd, scaleHt, x, y float64) 472 TransformScaleX(scaleWd, x, y float64) 473 TransformScaleXY(s, x, y float64) 474 TransformScaleY(scaleHt, x, y float64) 475 TransformSkew(angleX, angleY, x, y float64) 476 TransformSkewX(angleX, x, y float64) 477 TransformSkewY(angleY, x, y float64) 478 Transform(tm TransformMatrix) 479 TransformTranslate(tx, ty float64) 480 TransformTranslateX(tx float64) 481 TransformTranslateY(ty float64) 482 UnicodeTranslatorFromDescriptor(cpStr string) (rep func(string) string) 483 UnitToPointConvert(u float64) (pt float64) 484 UseTemplateScaled(t Template, corner PointType, size SizeType) 485 UseTemplate(t Template) 486 WriteAligned(width, lineHeight float64, textStr, alignStr string) 487 Writef(h float64, fmtStr string, args ...interface{}) 488 Write(h float64, txtStr string) 489 WriteLinkID(h float64, displayStr string, linkID int) 490 WriteLinkString(h float64, displayStr, targetStr string) 491 } 492 493 // PageBox defines the coordinates and extent of the various page box types 494 type PageBox struct { 495 SizeType 496 PointType 497 } 498 499 // Fpdf is the principal structure for creating a single PDF document 500 type Fpdf struct { 501 isCurrentUTF8 bool // is current font used in utf-8 mode 502 isRTL bool // is is right to left mode enabled 503 page int // current page number 504 n int // current object number 505 offsets []int // array of object offsets 506 templates map[string]Template // templates used in this document 507 templateObjects map[string]int // template object IDs within this document 508 importedObjs map[string][]byte // imported template objects (gofpdi) 509 importedObjPos map[string]map[int]string // imported template objects hashes and their positions (gofpdi) 510 importedTplObjs map[string]string // imported template names and IDs (hashed) (gofpdi) 511 importedTplIDs map[string]int // imported template ids hash to object id int (gofpdi) 512 buffer fmtBuffer // buffer holding in-memory PDF 513 pages []*bytes.Buffer // slice[page] of page content; 1-based 514 state int // current document state 515 compress bool // compression flag 516 k float64 // scale factor (number of points in user unit) 517 defOrientation string // default orientation 518 curOrientation string // current orientation 519 stdPageSizes map[string]SizeType // standard page sizes 520 defPageSize SizeType // default page size 521 defPageBoxes map[string]PageBox // default page size 522 curPageSize SizeType // current page size 523 pageSizes map[int]SizeType // used for pages with non default sizes or orientations 524 pageBoxes map[int]map[string]PageBox // used to define the crop, trim, bleed and art boxes 525 unitStr string // unit of measure for all rendered objects except fonts 526 wPt, hPt float64 // dimensions of current page in points 527 w, h float64 // dimensions of current page in user unit 528 lMargin float64 // left margin 529 tMargin float64 // top margin 530 rMargin float64 // right margin 531 bMargin float64 // page break margin 532 cMargin float64 // cell margin 533 x, y float64 // current position in user unit 534 lasth float64 // height of last printed cell 535 lineWidth float64 // line width in user unit 536 fontpath string // path containing fonts 537 fontLoader FontLoader // used to load font files from arbitrary locations 538 coreFonts map[string]bool // array of core font names 539 fonts map[string]fontDefType // array of used fonts 540 fontFiles map[string]fontFileType // array of font files 541 diffs []string // array of encoding differences 542 fontFamily string // current font family 543 fontStyle string // current font style 544 underline bool // underlining flag 545 strikeout bool // strike out flag 546 currentFont fontDefType // current font info 547 fontSizePt float64 // current font size in points 548 fontSize float64 // current font size in user unit 549 ws float64 // word spacing 550 images map[string]*ImageInfoType // array of used images 551 aliasMap map[string]string // map of alias->replacement 552 pageLinks [][]linkType // pageLinks[page][link], both 1-based 553 links []intLinkType // array of internal links 554 attachments []Attachment // slice of content to embed globally 555 pageAttachments [][]annotationAttach // 1-based array of annotation for file attachments (per page) 556 outlines []outlineType // array of outlines 557 outlineRoot int // root of outlines 558 autoPageBreak bool // automatic page breaking 559 acceptPageBreak func() bool // returns true to accept page break 560 pageBreakTrigger float64 // threshold used to trigger page breaks 561 inHeader bool // flag set when processing header 562 headerFnc func() // function provided by app and called to write header 563 headerHomeMode bool // set position to home after headerFnc is called 564 inFooter bool // flag set when processing footer 565 footerFnc func() // function provided by app and called to write footer 566 footerFncLpi func(bool) // function provided by app and called to write footer with last page flag 567 zoomMode string // zoom display mode 568 layoutMode string // layout display mode 569 xmp []byte // XMP metadata 570 producer string // producer 571 title string // title 572 subject string // subject 573 author string // author 574 keywords string // keywords 575 creator string // creator 576 creationDate time.Time // override for document CreationDate value 577 modDate time.Time // override for document ModDate value 578 aliasNbPagesStr string // alias for total number of pages 579 pdfVersion string // PDF version number 580 fontDirStr string // location of font definition files 581 capStyle int // line cap style: butt 0, round 1, square 2 582 joinStyle int // line segment join style: miter 0, round 1, bevel 2 583 dashArray []float64 // dash array 584 dashPhase float64 // dash phase 585 blendList []blendModeType // slice[idx] of alpha transparency modes, 1-based 586 blendMap map[string]int // map into blendList 587 blendMode string // current blend mode 588 alpha float64 // current transpacency 589 gradientList []gradientType // slice[idx] of gradient records 590 clipNest int // Number of active clipping contexts 591 transformNest int // Number of active transformation contexts 592 err error // Set if error occurs during life cycle of instance 593 protect protectType // document protection structure 594 layer layerRecType // manages optional layers in document 595 catalogSort bool // sort resource catalogs in document 596 nJs int // JavaScript object number 597 javascript *string // JavaScript code to include in the PDF 598 colorFlag bool // indicates whether fill and text colors are different 599 color struct { 600 // Composite values of colors 601 draw, fill, text colorType 602 } 603 spotColorMap map[string]spotColorType // Map of named ink-based colors 604 userUnderlineThickness float64 // A custom user underline thickness multiplier. 605 } 606 607 type encType struct { 608 uv int 609 name string 610 } 611 612 type encListType [256]encType 613 614 type fontBoxType struct { 615 Xmin, Ymin, Xmax, Ymax int 616 } 617 618 // Font flags for FontDescType.Flags as defined in the pdf specification. 619 const ( 620 // FontFlagFixedPitch is set if all glyphs have the same width (as 621 // opposed to proportional or variable-pitch fonts, which have 622 // different widths). 623 FontFlagFixedPitch = 1 << 0 624 // FontFlagSerif is set if glyphs have serifs, which are short 625 // strokes drawn at an angle on the top and bottom of glyph stems. 626 // (Sans serif fonts do not have serifs.) 627 FontFlagSerif = 1 << 1 628 // FontFlagSymbolic is set if font contains glyphs outside the 629 // Adobe standard Latin character set. This flag and the 630 // Nonsymbolic flag shall not both be set or both be clear. 631 FontFlagSymbolic = 1 << 2 632 // FontFlagScript is set if glyphs resemble cursive handwriting. 633 FontFlagScript = 1 << 3 634 // FontFlagNonsymbolic is set if font uses the Adobe standard 635 // Latin character set or a subset of it. 636 FontFlagNonsymbolic = 1 << 5 637 // FontFlagItalic is set if glyphs have dominant vertical strokes 638 // that are slanted. 639 FontFlagItalic = 1 << 6 640 // FontFlagAllCap is set if font contains no lowercase letters; 641 // typically used for display purposes, such as for titles or 642 // headlines. 643 FontFlagAllCap = 1 << 16 644 // SmallCap is set if font contains both uppercase and lowercase 645 // letters. The uppercase letters are similar to those in the 646 // regular version of the same typeface family. The glyphs for the 647 // lowercase letters have the same shapes as the corresponding 648 // uppercase letters, but they are sized and their proportions 649 // adjusted so that they have the same size and stroke weight as 650 // lowercase glyphs in the same typeface family. 651 SmallCap = 1 << 18 652 // ForceBold determines whether bold glyphs shall be painted with 653 // extra pixels even at very small text sizes by a conforming 654 // reader. If the ForceBold flag is set, features of bold glyphs 655 // may be thickened at small text sizes. 656 ForceBold = 1 << 18 657 ) 658 659 // FontDescType (font descriptor) specifies metrics and other 660 // attributes of a font, as distinct from the metrics of individual 661 // glyphs (as defined in the pdf specification). 662 type FontDescType struct { 663 // The maximum height above the baseline reached by glyphs in this 664 // font (for example for "S"). The height of glyphs for accented 665 // characters shall be excluded. 666 Ascent int 667 // The maximum depth below the baseline reached by glyphs in this 668 // font. The value shall be a negative number. 669 Descent int 670 // The vertical coordinate of the top of flat capital letters, 671 // measured from the baseline (for example "H"). 672 CapHeight int 673 // A collection of flags defining various characteristics of the 674 // font. (See the FontFlag* constants.) 675 Flags int 676 // A rectangle, expressed in the glyph coordinate system, that 677 // shall specify the font bounding box. This should be the smallest 678 // rectangle enclosing the shape that would result if all of the 679 // glyphs of the font were placed with their origins coincident 680 // and then filled. 681 FontBBox fontBoxType 682 // The angle, expressed in degrees counterclockwise from the 683 // vertical, of the dominant vertical strokes of the font. (The 684 // 9-o’clock position is 90 degrees, and the 3-o’clock position 685 // is –90 degrees.) The value shall be negative for fonts that 686 // slope to the right, as almost all italic fonts do. 687 ItalicAngle int 688 // The thickness, measured horizontally, of the dominant vertical 689 // stems of glyphs in the font. 690 StemV int 691 // The width to use for character codes whose widths are not 692 // specified in a font dictionary’s Widths array. This shall have 693 // a predictable effect only if all such codes map to glyphs whose 694 // actual widths are the same as the value of the MissingWidth 695 // entry. (Default value: 0.) 696 MissingWidth int 697 } 698 699 type fontDefType struct { 700 Tp string // "Core", "TrueType", ... 701 Name string // "Courier-Bold", ... 702 Desc FontDescType // Font descriptor 703 Up int // Underline position 704 Ut int // Underline thickness 705 Cw []int // Character width by ordinal 706 Enc string // "cp1252", ... 707 Diff string // Differences from reference encoding 708 File string // "Redressed.z" 709 Size1, Size2 int // Type1 values 710 OriginalSize int // Size of uncompressed font file 711 N int // Set by font loader 712 DiffN int // Position of diff in app array, set by font loader 713 i string // 1-based position in font list, set by font loader, not this program 714 utf8File *utf8FontFile // UTF-8 font 715 usedRunes map[int]int // Array of used runes 716 } 717 718 // generateFontID generates a font Id from the font definition 719 func generateFontID(fdt fontDefType) (string, error) { 720 // file can be different if generated in different instance 721 fdt.File = "" 722 b, err := json.Marshal(&fdt) 723 return fmt.Sprintf("%x", sha1.Sum(b)), err 724 } 725 726 type fontInfoType struct { 727 Data []byte 728 File string 729 OriginalSize int 730 FontName string 731 Bold bool 732 IsFixedPitch bool 733 UnderlineThickness int 734 UnderlinePosition int 735 Widths []int 736 Size1, Size2 uint32 737 Desc FontDescType 738 }