github.com/signintech/pdft@v0.5.0/minigopdf/kern_test.go (about) 1 package gopdf 2 3 import ( 4 "errors" 5 "fmt" 6 "log" 7 "testing" 8 ) 9 10 func TestKern01(t *testing.T) { 11 Wo, err := kern01("test/res/times.ttf", "times", 'W', 'o') 12 if err != nil { 13 t.Error(err) 14 return 15 } 16 17 if Wo != -80 { 18 t.Error(fmt.Sprintf("Wo must be -80 (but %d)", Wo)) 19 //return 20 } 21 22 Wi, err := kern01("test/res/times.ttf", "times", 'W', 'i') 23 if err != nil { 24 t.Error(err) 25 return 26 } 27 28 if Wi != -40 { 29 t.Error(fmt.Sprintf("Wi must be -40 (but %d)", Wi)) 30 //return 31 } 32 33 } 34 35 func kern01(font string, prefix string, leftRune rune, rightRune rune) (int, error) { 36 37 pdf := GoPdf{} 38 pdf.Start(Config{Unit: "pt", PageSize: Rect{W: 595.28, H: 841.89}}) //595.28, 841.89 = A4 39 pdf.AddPage() 40 err := pdf.AddTTFFontWithOption(prefix, font, TtfOption{ 41 UseKerning: true, 42 }) 43 if err != nil { 44 log.Print(err.Error()) 45 return 0, err 46 } 47 48 err = pdf.SetFont(prefix, "", 50) 49 if err != nil { 50 log.Print(err.Error()) 51 return 0, err 52 } 53 54 gindexleftRune, err := pdf.curr.Font_ISubset.CharCodeToGlyphIndex(leftRune) 55 if err != nil { 56 return 0, err 57 } 58 59 gindexrightRune, err := pdf.curr.Font_ISubset.CharCodeToGlyphIndex(rightRune) 60 if err != nil { 61 return 0, err 62 } 63 //fmt.Printf("gindexleftRune = %d gindexrightRune=%d \n", gindexleftRune, gindexrightRune) 64 kernTb := pdf.curr.Font_ISubset.ttfp.Kern() 65 66 //fmt.Printf("UnitsPerEm = %d\n", pdf.Curr.Font_ISubset.ttfp.UnitsPerEm()) 67 68 //fmt.Printf("len =%d\n", len(kernTb.Kerning)) 69 for left, kval := range kernTb.Kerning { 70 if left == gindexleftRune { 71 for right, val := range kval { 72 if right == gindexrightRune { 73 //fmt.Printf("left=%d right= %d val=%d\n", left, right, val) 74 valPdfUnit := convertTTFUnit2PDFUnit(int(val), int(pdf.curr.Font_ISubset.ttfp.UnitsPerEm())) 75 return valPdfUnit, nil 76 } 77 } 78 break 79 } 80 } 81 82 return 0, errors.New("not found") 83 }