golang用西里尔文创建pdf

我需要使用西里尔符号创建 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 或图像?


谢谢你。


当年话下
浏览 234回答 1
1回答

肥皂起泡泡

首先,您忽略了最后一行中的错误。pdf.OutputFileAndClose返回一个错误,所以你应该检查它:err := pdf.OutputFileAndClose("test.pdf")if err != nil {    log.Fatal(err)}除此之外,你的第一个例子对我有用。生成的输出如下所示:这是我使用的代码,您会发现它与您的非常相似:package mainimport (    "log"    "github.com/jung-kurt/gofpdf")func main() {    pdf := gofpdf.New("P", "mm", "A4", "")    pdf.AddFont("Helvetica", "", "helvetica_1251.json")    pdf.AddPage()    pdf.SetFont("Helvetica", "", 16)    tr := pdf.UnicodeTranslatorFromDescriptor("cp1251")    pdf.Cell(15, 50, tr("русский текст"))    err := pdf.OutputFileAndClose("test.pdf")    if err != nil {        log.Println(err)    }}对于上面的代码,重要的是要确保helvetica_1251.z,helvetica_1251.json和cp1251.map(来自$GOPATH/src/github.com/jung-kurt/gofpdf/font,或由makefont工具生成)都在当前目录中。如果您可以确认这对您有用,您可以继续将它们移动到字体目录中并相应地更改代码。我最好的猜测是,您可能会默默地忽略有关这些文件之一的错误警告。PS 我运行的是 Mac OS X。如果您在另一个系统上,请确保您安装了支持西里尔字符的 Helvetica 版本。更新对于将来遇到此问题的其他人,我想在此处添加最终解决方案。从下面的评论:感谢 jung-kurt 我找到了解决方案。您可以通过添加 pdf.SetCompression(true) 来避免 Windows 上的此错误 – Timur Shahmuratov
打开App,查看更多内容
随时随地看视频慕课网APP