diff options
author | Kurt <kurt.w.jung@gmail.com> | 2016-08-18 11:53:32 -0400 |
---|---|---|
committer | Kurt <kurt.w.jung@gmail.com> | 2016-08-18 11:53:32 -0400 |
commit | 157aff3575e05946317098493519bb770b328972 (patch) | |
tree | 675c84f2ec31fdab6dc4ced54be388de7a9af29c | |
parent | 5f4a9bf681f9360dc6485cb34108b7fd0bb43c02 (diff) |
Allow default compression mode to be set. Go 1.7 introduces a new compression/flate routine that results in different compressed streams than before. Consequently, PDFs generated with go 1.7 are not generally binary-equivalent with those generated with previous versions. Turning off compression for test files removes this variability. However, it does not help with PDFs that contain images. For now, those reference PDFs have been removed to allow tests to proceed.
49 files changed, 281 insertions, 59 deletions
@@ -44,6 +44,7 @@ import ( var gl struct { catalogSort bool + noCompress bool // Initial zero value indicates compression creationDate time.Time } @@ -174,7 +175,7 @@ func fpdfNew(orientationStr, unitStr, sizeStr, fontDirStr string, size SizeType) return f.autoPageBreak } // Enable compression - f.SetCompression(true) + f.SetCompression(!gl.noCompress) f.blendList = make([]blendModeType, 0, 8) f.blendList = append(f.blendList, blendModeType{}) // blendList[0] is unused (1-based) f.blendMap = make(map[string]int) @@ -431,15 +432,19 @@ func (f *Fpdf) SetDisplayMode(zoomStr, layoutStr string) { } } +// SetDefaultCompression controls the default setting of the internal +// compression flag. See SetCompression() for more details. Compression is on +// by default. +func SetDefaultCompression(compress bool) { + gl.noCompress = !compress +} + // SetCompression activates or deactivates page compression with zlib. When // activated, the internal representation of each page is compressed, which // leads to a compression ratio of about 2 for the resulting document. // Compression is on by default. func (f *Fpdf) SetCompression(compress bool) { - // if(function_exists('gzcompress')) f.compress = compress - // else - // $this->compress = false; } // SetTitle defines the title of the document. isUTF8 indicates if the string diff --git a/fpdf_test.go b/fpdf_test.go index 71fe7ad..f7ef961 100644 --- a/fpdf_test.go +++ b/fpdf_test.go @@ -602,22 +602,18 @@ func ExampleFpdf_SetKeywords() { err = gofpdf.MakeFont(example.FontFile("CalligrapherRegular.pfb"), example.FontFile("cp1252.map"), example.FontDir(), nil, true) if err == nil { - err = gofpdf.MakeFont(example.FontFile("calligra.ttf"), - example.FontFile("cp1252.map"), example.FontDir(), nil, true) - if err == nil { - pdf := gofpdf.New("", "", "", "") - pdf.SetFontLocation(example.FontDir()) - pdf.SetTitle("世界", true) - pdf.SetAuthor("世界", true) - pdf.SetSubject("世界", true) - pdf.SetCreator("世界", true) - pdf.SetKeywords("世界", true) - pdf.AddFont("Calligrapher", "", "CalligrapherRegular.json") - pdf.AddPage() - pdf.SetFont("Calligrapher", "", 16) - pdf.Writef(5, "\x95 %s \x95", pdf) - err = pdf.OutputFileAndClose(fileStr) - } + pdf := gofpdf.New("", "", "", "") + pdf.SetFontLocation(example.FontDir()) + pdf.SetTitle("世界", true) + pdf.SetAuthor("世界", true) + pdf.SetSubject("世界", true) + pdf.SetCreator("世界", true) + pdf.SetKeywords("世界", true) + pdf.AddFont("Calligrapher", "", "CalligrapherRegular.json") + pdf.AddPage() + pdf.SetFont("Calligrapher", "", 16) + pdf.Writef(5, "\x95 %s \x95", pdf) + err = pdf.OutputFileAndClose(fileStr) } example.Summary(err, fileStr) // Output: diff --git a/internal/example/example.go b/internal/example/example.go index 56ffb23..edf2388 100644 --- a/internal/example/example.go +++ b/internal/example/example.go @@ -31,6 +31,7 @@ var gofpdfDir string func init() { setRoot() + gofpdf.SetDefaultCompression(false) gofpdf.SetDefaultCatalogSort(true) gofpdf.SetDefaultCreationDate(time.Date(2000, 1, 1, 0, 0, 0, 0, time.UTC)) } diff --git a/pdf/reference/Fpdf_AddFont.pdf b/pdf/reference/Fpdf_AddFont.pdf Binary files differindex e5c8266..f6a7404 100644 --- a/pdf/reference/Fpdf_AddFont.pdf +++ b/pdf/reference/Fpdf_AddFont.pdf diff --git a/pdf/reference/Fpdf_AddLayer.pdf b/pdf/reference/Fpdf_AddLayer.pdf Binary files differindex 16b4b5b..d0edbe7 100644 --- a/pdf/reference/Fpdf_AddLayer.pdf +++ b/pdf/reference/Fpdf_AddLayer.pdf diff --git a/pdf/reference/Fpdf_AddPage.pdf b/pdf/reference/Fpdf_AddPage.pdf Binary files differindex 72c59eb..cfeafea 100644 --- a/pdf/reference/Fpdf_AddPage.pdf +++ b/pdf/reference/Fpdf_AddPage.pdf diff --git a/pdf/reference/Fpdf_Beziergon.pdf b/pdf/reference/Fpdf_Beziergon.pdf Binary files differindex b33e2ee..d0ac598 100644 --- a/pdf/reference/Fpdf_Beziergon.pdf +++ b/pdf/reference/Fpdf_Beziergon.pdf diff --git a/pdf/reference/Fpdf_Bookmark.pdf b/pdf/reference/Fpdf_Bookmark.pdf Binary files differindex 463d49e..a7d8c7c 100644 --- a/pdf/reference/Fpdf_Bookmark.pdf +++ b/pdf/reference/Fpdf_Bookmark.pdf diff --git a/pdf/reference/Fpdf_CellFormat_align.pdf b/pdf/reference/Fpdf_CellFormat_align.pdf Binary files differindex 5074357..e197a42 100644 --- a/pdf/reference/Fpdf_CellFormat_align.pdf +++ b/pdf/reference/Fpdf_CellFormat_align.pdf diff --git a/pdf/reference/Fpdf_CellFormat_codepage.pdf b/pdf/reference/Fpdf_CellFormat_codepage.pdf Binary files differindex 4653511..045caf6 100644 --- a/pdf/reference/Fpdf_CellFormat_codepage.pdf +++ b/pdf/reference/Fpdf_CellFormat_codepage.pdf diff --git a/pdf/reference/Fpdf_CellFormat_codepageescape.pdf b/pdf/reference/Fpdf_CellFormat_codepageescape.pdf Binary files differindex 1d31153..a59ed43 100644 --- a/pdf/reference/Fpdf_CellFormat_codepageescape.pdf +++ b/pdf/reference/Fpdf_CellFormat_codepageescape.pdf diff --git a/pdf/reference/Fpdf_CellFormat_tables.pdf b/pdf/reference/Fpdf_CellFormat_tables.pdf Binary files differindex ef0a880..ccb45f4 100644 --- a/pdf/reference/Fpdf_CellFormat_tables.pdf +++ b/pdf/reference/Fpdf_CellFormat_tables.pdf diff --git a/pdf/reference/Fpdf_Circle_figures.pdf b/pdf/reference/Fpdf_Circle_figures.pdf Binary files differindex 097d53c..a13ba38 100644 --- a/pdf/reference/Fpdf_Circle_figures.pdf +++ b/pdf/reference/Fpdf_Circle_figures.pdf diff --git a/pdf/reference/Fpdf_ClipText.pdf b/pdf/reference/Fpdf_ClipText.pdf Binary files differindex 258ea1f..2b1ed00 100644 --- a/pdf/reference/Fpdf_ClipText.pdf +++ b/pdf/reference/Fpdf_ClipText.pdf diff --git a/pdf/reference/Fpdf_DrawPath_fill.pdf b/pdf/reference/Fpdf_DrawPath_fill.pdf Binary files differindex fdde12c..488d72d 100644 --- a/pdf/reference/Fpdf_DrawPath_fill.pdf +++ b/pdf/reference/Fpdf_DrawPath_fill.pdf diff --git a/pdf/reference/Fpdf_EmbeddedFont.pdf b/pdf/reference/Fpdf_EmbeddedFont.pdf Binary files differindex 05eb36b..108986a 100644 --- a/pdf/reference/Fpdf_EmbeddedFont.pdf +++ b/pdf/reference/Fpdf_EmbeddedFont.pdf diff --git a/pdf/reference/Fpdf_HTMLBasicNew.pdf b/pdf/reference/Fpdf_HTMLBasicNew.pdf Binary files differindex fb5cbf4..587f2dc 100644 --- a/pdf/reference/Fpdf_HTMLBasicNew.pdf +++ b/pdf/reference/Fpdf_HTMLBasicNew.pdf diff --git a/pdf/reference/Fpdf_Image.pdf b/pdf/reference/Fpdf_Image.pdf Binary files differdeleted file mode 100644 index 838dd4b..0000000 --- a/pdf/reference/Fpdf_Image.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_LinearGradient_gradient.pdf b/pdf/reference/Fpdf_LinearGradient_gradient.pdf Binary files differindex cb1e3bd..67728d7 100644 --- a/pdf/reference/Fpdf_LinearGradient_gradient.pdf +++ b/pdf/reference/Fpdf_LinearGradient_gradient.pdf diff --git a/pdf/reference/Fpdf_MoveTo_path.pdf b/pdf/reference/Fpdf_MoveTo_path.pdf Binary files differindex b5dcca0..b73aee4 100644 --- a/pdf/reference/Fpdf_MoveTo_path.pdf +++ b/pdf/reference/Fpdf_MoveTo_path.pdf diff --git a/pdf/reference/Fpdf_MultiCell.pdf b/pdf/reference/Fpdf_MultiCell.pdf Binary files differindex a073d75..50c82b5 100644 --- a/pdf/reference/Fpdf_MultiCell.pdf +++ b/pdf/reference/Fpdf_MultiCell.pdf diff --git a/pdf/reference/Fpdf_PageSize.pdf b/pdf/reference/Fpdf_PageSize.pdf Binary files differindex f523782..e3e7e56 100644 --- a/pdf/reference/Fpdf_PageSize.pdf +++ b/pdf/reference/Fpdf_PageSize.pdf diff --git a/pdf/reference/Fpdf_Polygon.pdf b/pdf/reference/Fpdf_Polygon.pdf Binary files differindex a3c04ed..c16719e 100644 --- a/pdf/reference/Fpdf_Polygon.pdf +++ b/pdf/reference/Fpdf_Polygon.pdf diff --git a/pdf/reference/Fpdf_RegisterImage.pdf b/pdf/reference/Fpdf_RegisterImage.pdf Binary files differdeleted file mode 100644 index 80a14d9..0000000 --- a/pdf/reference/Fpdf_RegisterImage.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_RegisterImageReader_url.pdf b/pdf/reference/Fpdf_RegisterImageReader_url.pdf Binary files differdeleted file mode 100644 index 171ad32..0000000 --- a/pdf/reference/Fpdf_RegisterImageReader_url.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_SVGBasicWrite.pdf b/pdf/reference/Fpdf_SVGBasicWrite.pdf Binary files differindex bdefa65..bc05a2b 100644 --- a/pdf/reference/Fpdf_SVGBasicWrite.pdf +++ b/pdf/reference/Fpdf_SVGBasicWrite.pdf diff --git a/pdf/reference/Fpdf_SetAcceptPageBreakFunc_landscape.pdf b/pdf/reference/Fpdf_SetAcceptPageBreakFunc_landscape.pdf Binary files differdeleted file mode 100644 index 7997df9..0000000 --- a/pdf/reference/Fpdf_SetAcceptPageBreakFunc_landscape.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_SetAlpha_transparency.pdf b/pdf/reference/Fpdf_SetAlpha_transparency.pdf Binary files differdeleted file mode 100644 index 49dde6a..0000000 --- a/pdf/reference/Fpdf_SetAlpha_transparency.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_SetFontLoader.pdf b/pdf/reference/Fpdf_SetFontLoader.pdf Binary files differindex 1aa2f6f..9af78e2 100644 --- a/pdf/reference/Fpdf_SetFontLoader.pdf +++ b/pdf/reference/Fpdf_SetFontLoader.pdf diff --git a/pdf/reference/Fpdf_SetKeywords.pdf b/pdf/reference/Fpdf_SetKeywords.pdf Binary files differdeleted file mode 100644 index 3d3d3a5..0000000 --- a/pdf/reference/Fpdf_SetKeywords.pdf +++ /dev/null diff --git a/pdf/reference/Fpdf_SetLeftMargin_multicolumn.pdf b/pdf/reference/Fpdf_SetLeftMargin_multicolumn.pdf Binary files differindex 91b6d59..6ba28c8 100644 --- a/pdf/reference/Fpdf_SetLeftMargin_multicolumn.pdf +++ b/pdf/reference/Fpdf_SetLeftMargin_multicolumn.pdf diff --git a/pdf/reference/Fpdf_SetLineJoinStyle_caps.pdf b/pdf/reference/Fpdf_SetLineJoinStyle_caps.pdf Binary files differindex 9b9badb..94f3a9b 100644 --- a/pdf/reference/Fpdf_SetLineJoinStyle_caps.pdf +++ b/pdf/reference/Fpdf_SetLineJoinStyle_caps.pdf diff --git a/pdf/reference/Fpdf_SetProtection.pdf b/pdf/reference/Fpdf_SetProtection.pdf Binary files differindex 8d007c7..1432cde 100644 --- a/pdf/reference/Fpdf_SetProtection.pdf +++ b/pdf/reference/Fpdf_SetProtection.pdf diff --git a/pdf/reference/Fpdf_Splitlines.pdf b/pdf/reference/Fpdf_Splitlines.pdf Binary files differindex d8064be..e9acfd1 100644 --- a/pdf/reference/Fpdf_Splitlines.pdf +++ b/pdf/reference/Fpdf_Splitlines.pdf diff --git a/pdf/reference/Fpdf_TransformBegin.pdf b/pdf/reference/Fpdf_TransformBegin.pdf Binary files differindex d1ffe34..008d421 100644 --- a/pdf/reference/Fpdf_TransformBegin.pdf +++ b/pdf/reference/Fpdf_TransformBegin.pdf diff --git a/pdf/reference/Fpdf_WriteAligned.pdf b/pdf/reference/Fpdf_WriteAligned.pdf Binary files differindex c173146..c3b52a0 100644 --- a/pdf/reference/Fpdf_WriteAligned.pdf +++ b/pdf/reference/Fpdf_WriteAligned.pdf diff --git a/pdf/reference/basic.pdf b/pdf/reference/basic.pdf Binary files differindex 80a7fbf..803212f 100644 --- a/pdf/reference/basic.pdf +++ b/pdf/reference/basic.pdf diff --git a/pdf/reference/contrib_barcode_Register.pdf b/pdf/reference/contrib_barcode_Register.pdf Binary files differdeleted file mode 100644 index 5ad12e7..0000000 --- a/pdf/reference/contrib_barcode_Register.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterCodabar.pdf b/pdf/reference/contrib_barcode_RegisterCodabar.pdf Binary files differdeleted file mode 100644 index 4ed247b..0000000 --- a/pdf/reference/contrib_barcode_RegisterCodabar.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterCode128.pdf b/pdf/reference/contrib_barcode_RegisterCode128.pdf Binary files differdeleted file mode 100644 index f76ae86..0000000 --- a/pdf/reference/contrib_barcode_RegisterCode128.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterCode39.pdf b/pdf/reference/contrib_barcode_RegisterCode39.pdf Binary files differdeleted file mode 100644 index fee2c99..0000000 --- a/pdf/reference/contrib_barcode_RegisterCode39.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterDataMatrix.pdf b/pdf/reference/contrib_barcode_RegisterDataMatrix.pdf Binary files differdeleted file mode 100644 index 5ea011d..0000000 --- a/pdf/reference/contrib_barcode_RegisterDataMatrix.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterEAN.pdf b/pdf/reference/contrib_barcode_RegisterEAN.pdf Binary files differdeleted file mode 100644 index 166090d..0000000 --- a/pdf/reference/contrib_barcode_RegisterEAN.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterQR.pdf b/pdf/reference/contrib_barcode_RegisterQR.pdf Binary files differdeleted file mode 100644 index 6e989e3..0000000 --- a/pdf/reference/contrib_barcode_RegisterQR.pdf +++ /dev/null diff --git a/pdf/reference/contrib_barcode_RegisterTwoOfFive.pdf b/pdf/reference/contrib_barcode_RegisterTwoOfFive.pdf Binary files differdeleted file mode 100644 index 0078dc1..0000000 --- a/pdf/reference/contrib_barcode_RegisterTwoOfFive.pdf +++ /dev/null diff --git a/pdf/reference/contrib_httpimg_Register.pdf b/pdf/reference/contrib_httpimg_Register.pdf Binary files differdeleted file mode 100644 index 212ca93..0000000 --- a/pdf/reference/contrib_httpimg_Register.pdf +++ /dev/null @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2013-2016 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" + "fmt" + "strings" +) + +func (f *Fpdf) pngColorSpace(ct byte) (colspace string, colorVal int) { + colorVal = 1 + switch ct { + case 0, 4: + colspace = "DeviceGray" + case 2, 6: + colspace = "DeviceRGB" + colorVal = 3 + case 3: + colspace = "Indexed" + default: + f.err = fmt.Errorf("unknown color type in PNG buffer: %d", ct) + } + return +} + +func (f *Fpdf) parsepngstream(buf *bytes.Buffer, readdpi bool) (info *ImageInfoType) { + info = f.newImageInfo() + // Check signature + if string(buf.Next(8)) != "\x89PNG\x0d\x0a\x1a\x0a" { + f.err = fmt.Errorf("not a PNG buffer") + return + } + // Read header chunk + _ = buf.Next(4) + if string(buf.Next(4)) != "IHDR" { + f.err = fmt.Errorf("incorrect PNG buffer") + return + } + w := f.readBeInt32(buf) + h := f.readBeInt32(buf) + bpc := f.readByte(buf) + if bpc > 8 { + f.err = fmt.Errorf("16-bit depth not supported in PNG file") + } + ct := f.readByte(buf) + var colspace string + var colorVal int + colspace, colorVal = f.pngColorSpace(ct) + if f.err != nil { + return + } + if f.readByte(buf) != 0 { + f.err = fmt.Errorf("'unknown compression method in PNG buffer") + return + } + if f.readByte(buf) != 0 { + f.err = fmt.Errorf("'unknown filter method in PNG buffer") + return + } + if f.readByte(buf) != 0 { + f.err = fmt.Errorf("interlacing not supported in PNG buffer") + return + } + _ = buf.Next(4) + dp := sprintf("/Predictor 15 /Colors %d /BitsPerComponent %d /Columns %d", colorVal, bpc, w) + // Scan chunks looking for palette, transparency and image data + pal := make([]byte, 0, 32) + var trns []int + data := make([]byte, 0, 32) + loop := true + for loop { + n := int(f.readBeInt32(buf)) + // dbg("Loop [%d]", n) + switch string(buf.Next(4)) { + case "PLTE": + // dbg("PLTE") + // Read palette + pal = buf.Next(n) + _ = buf.Next(4) + case "tRNS": + // dbg("tRNS") + // Read transparency info + t := buf.Next(n) + if ct == 0 { + trns = []int{int(t[1])} // ord(substr($t,1,1))); + } else if ct == 2 { + trns = []int{int(t[1]), int(t[3]), int(t[5])} // array(ord(substr($t,1,1)), ord(substr($t,3,1)), ord(substr($t,5,1))); + } else { + pos := strings.Index(string(t), "\x00") + if pos >= 0 { + trns = []int{pos} // array($pos); + } + } + _ = buf.Next(4) + case "IDAT": + // dbg("IDAT") + // Read image data block + data = append(data, buf.Next(n)...) + _ = buf.Next(4) + case "IEND": + // dbg("IEND") + loop = false + case "pHYs": + // dbg("pHYs") + // png files theoretically support different x/y dpi + // but we ignore files like this + // but if they're the same then we can stamp our info + // object with it + x := int(f.readBeInt32(buf)) + y := int(f.readBeInt32(buf)) + units := buf.Next(1)[0] + // fmt.Printf("got a pHYs block, x=%d, y=%d, u=%d, readdpi=%t\n", + // x, y, int(units), readdpi) + // only modify the info block if the user wants us to + if x == y && readdpi { + switch units { + // if units is 1 then measurement is px/meter + case 1: + info.dpi = float64(x) / 39.3701 // inches per meter + default: + info.dpi = float64(x) + } + } + _ = buf.Next(4) + default: + // dbg("default") + _ = buf.Next(n + 4) + } + if loop { + loop = n > 0 + } + } + if colspace == "Indexed" && len(pal) == 0 { + f.err = fmt.Errorf("missing palette in PNG buffer") + } + info.w = float64(w) + info.h = float64(h) + info.cs = colspace + info.bpc = int(bpc) + info.f = "FlateDecode" + info.dp = dp + info.pal = pal + info.trns = trns + // dbg("ct [%d]", ct) + if ct >= 4 { + // Separate alpha and color channels + var err error + data, err = sliceUncompress(data) + if err != nil { + f.err = err + return + } + var color, alpha bytes.Buffer + if ct == 4 { + // Gray image + width := int(w) + height := int(h) + length := 2 * width + var pos, elPos int + for i := 0; i < height; i++ { + pos = (1 + length) * i + color.WriteByte(data[pos]) + alpha.WriteByte(data[pos]) + elPos = pos + 1 + for k := 0; k < width; k++ { + color.WriteByte(data[elPos]) + alpha.WriteByte(data[elPos+1]) + elPos += 2 + } + } + } else { + // RGB image + width := int(w) + height := int(h) + length := 4 * width + var pos, elPos int + for i := 0; i < height; i++ { + pos = (1 + length) * i + color.WriteByte(data[pos]) + alpha.WriteByte(data[pos]) + elPos = pos + 1 + for k := 0; k < width; k++ { + color.Write(data[elPos : elPos+3]) + alpha.WriteByte(data[elPos+3]) + elPos += 4 + } + } + } + data = sliceCompress(color.Bytes()) + info.smask = sliceCompress(alpha.Bytes()) + if f.pdfVersion < "1.4" { + f.pdfVersion = "1.4" + } + } + info.data = data + return +} diff --git a/template.go b/template.go index 6f29196..1826fd7 100644 --- a/template.go +++ b/template.go @@ -109,6 +109,24 @@ type Template interface { Templates() []Template } +func (f *Fpdf) templateFontCatalog() { + var keyList []string + var font fontDefType + var key string + f.out("/Font <<") + for key = range f.fonts { + keyList = append(keyList, key) + } + if f.catalogSort { + sort.Strings(keyList) + } + for _, key = range keyList { + font = f.fonts[key] + f.outf("/F%d %d 0 R", font.I, font.N) + } + f.out(">>") +} + // putTemplates writes the templates to the PDF func (f *Fpdf) putTemplates() { filter := "" @@ -135,23 +153,7 @@ func (f *Fpdf) putTemplates() { f.out("/Resources ") f.out("<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]") - f.out("/Font <<") - { - var keyList []string - var font fontDefType - var key string - for key = range f.fonts { - keyList = append(keyList, key) - } - if f.catalogSort { - sort.Strings(keyList) - } - for _, key = range keyList { - font = f.fonts[key] - f.outf("/F%d %d 0 R", font.I, font.N) - } - } - f.out(">>") + f.templateFontCatalog() tImages := t.Images() tTemplates := t.Templates() diff --git a/ttfparser.go b/ttfparser.go index 3df633c..669ab4d 100644 --- a/ttfparser.go +++ b/ttfparser.go @@ -89,28 +89,8 @@ func TtfParse(fileStr string) (TtfRec TtfType, err error) { t.Skip(4) // length t.tables[tag] = offset } - if err = t.ParseHead(); err != nil { - return - } - if err = t.ParseHhea(); err != nil { - return - } - if err = t.ParseMaxp(); err != nil { - return - } - if err = t.ParseHmtx(); err != nil { - return - } - if err = t.ParseCmap(); err != nil { - return - } - if err = t.ParseName(); err != nil { - return - } - if err = t.ParseOS2(); err != nil { - return - } - if err = t.ParsePost(); err != nil { + err = t.ParseComponents() + if err != nil { return } t.f.Close() @@ -118,6 +98,32 @@ func TtfParse(fileStr string) (TtfRec TtfType, err error) { return } +func (t *ttfParser) ParseComponents() (err error) { + err = t.ParseHead() + if err == nil { + err = t.ParseHhea() + if err == nil { + err = t.ParseMaxp() + if err == nil { + err = t.ParseHmtx() + if err == nil { + err = t.ParseCmap() + if err == nil { + err = t.ParseName() + if err == nil { + err = t.ParseOS2() + if err == nil { + err = t.ParsePost() + } + } + } + } + } + } + } + return +} + func (t *ttfParser) ParseHead() (err error) { err = t.Seek("head") t.Skip(3 * 4) // version, fontRevision, checkSumAdjustment |