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  }