我需要使用西里尔符号创建 pdf 文件。我从https://github.com/jung-kurt/gofpdf开始,但它需要 1251 个符号才能生成正确的西里尔字母。我试过了


package main


import (

    "github.com/jung-kurt/gofpdf"

    "fmt"

    "os"

)


func main() {

    pwd, err := os.Getwd()

    if err != nil {

        fmt.Println(err)

        os.Exit(1)

    }

    pdf := gofpdf.New("P", "mm", "A4", "")

    pdf.AddFont("Helvetica", "", pwd + "/font/helvetica_1251.json")

    pdf.AddPage()

    pdf.SetFont("Helvetica", "", 16)

    tr := pdf.UnicodeTranslatorFromDescriptor("cp1251")

    pdf.Cell(15, 50, tr("русский текст"))

    pdf.OutputFileAndClose("test.pdf")

}

但它只产生点而不是文本。


然后我尝试使用https://github.com/golang/freetype创建带有文本的图像,然后将其插入到 pdf 中。所以我试过了


package main


import (

    "github.com/jung-kurt/gofpdf"

    "github.com/golang/freetype"

    "image"

    "fmt"

    "os"

    "bytes"

    "image/jpeg"

    "io/ioutil"

    "image/draw"

)


func main() {

    pwd, err := os.Getwd()

    if err != nil {

        fmt.Println(err)

        os.Exit(1)

    }

    dataFont, err := ioutil.ReadFile(pwd + "/font/luxisr.ttf")

    if err != nil {

        fmt.Printf("%v",err)

    }

    f, err := freetype.ParseFont(dataFont)

    if err != nil {

        fmt.Printf("%v",err)

    }

    dst := image.NewRGBA(image.Rect(0, 0, 800, 600))

    draw.Draw(dst, dst.Bounds(), image.White, image.ZP, draw.Src)

    c := freetype.NewContext()

    c.SetDst(dst)

    c.SetClip(dst.Bounds())

    c.SetSrc(image.Black)

    c.SetFont(f)

    c.DrawString("русский текст", freetype.Pt(0, 16))

    pdf := gofpdf.New("P", "mm", "A4", "")

    pdf.AddPage()

    buf := new(bytes.Buffer)

    err = jpeg.Encode(buf, dst, nil)


    if err != nil {

        fmt.Printf("%v",err)

    }


    reader := bytes.NewReader(buf.Bytes())

    textName := "text1"

    pdf.RegisterImageReader(textName, "jpg", reader)

    pdf.Image(textName, 15, 15, 0, 0, false, "jpg", 0, "")

    pdf.OutputFileAndClose("test.pdf")

}

但结果我收到的是正方形而不是文本,因为似乎 freetype 需要文本的 unicode 符号。


是否可以将通常使用 utf-8 的字符串转换为 unicode?如何使用西里尔文本创建 pdf 或图像?


谢谢你。