为了账号安全,请及时绑定邮箱和手机立即绑定

golang用西里尔文创建pdf

golang用西里尔文创建pdf

Go
当年话下 2021-12-07 19:44:04
我需要使用西里尔符号创建 pdf 文件。我从https://github.com/jung-kurt/gofpdf开始,但它需要 1251 个符号才能生成正确的西里尔字母。我试过了package mainimport (    "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 mainimport (    "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 或图像?谢谢你。
查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

首先,您忽略了最后一行中的错误。pdf.OutputFileAndClose返回一个错误,所以你应该检查它:


err := pdf.OutputFileAndClose("test.pdf")

if err != nil {

    log.Fatal(err)

}

除此之外,你的第一个例子对我有用。生成的输出如下所示:

//img1.sycdn.imooc.com//61af492200018d4f02140074.jpg

这是我使用的代码,您会发现它与您的非常相似:


package main


import (

    "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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 231 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信