首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用cyrillic创建pdf

用cyrillic创建pdf
EN

Stack Overflow用户
提问于 2016-02-10 06:25:36
回答 1查看 3.7K关注 0票数 3

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

代码语言:javascript
复制
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。所以我试过

代码语言:javascript
复制
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")
}

但结果是,我接收的是正方形,而不是文本,因为自由类型似乎需要unicode符号作为文本。

是否有可能将通常在utf-8中的字符串转换为unicode?我如何创建pdf或图像与西里尔文字?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-10 08:39:23

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

代码语言:javascript
复制
err := pdf.OutputFileAndClose("test.pdf")
if err != nil {
    log.Fatal(err)
}

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

下面是我使用的代码,您将看到它非常类似于您的代码:

代码语言:javascript
复制
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.zhelvetica_1251.jsoncp1251.map (来自$GOPATH/src/github.com/jung-kurt/gofpdf/font,或由makefont工具生成)都在当前目录中。如果您能够确认这对您有效,您可以继续将它们移动到字体目录中,并相应地更改代码。我最好的猜测是,您可能忽略了其中一个文件的错误警告。

PS我正在运行Mac。如果您在另一个系统上,请确保安装了Helvetica版本,并安装了cyrillic字符支持。

更新

对于将来面临这个问题的其他人,我想在这里添加最后的解决方案。来自以下评论:

多亏了jung-kurt我找到了解决办法。您可以通过添加pdf.SetCompression(true) - Timur来避免Windows上的这个错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35308271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档