golang使用西里尔文创建pdf

golang使用西里尔文创建pdf,pdf,go,cyrillic,Pdf,Go,Cyrillic,我需要用西里尔字母符号创建pdf文件。我已经开始了,但它需要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) } pd

我需要用西里尔字母符号创建pdf文件。我已经开始了,但它需要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")
}
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")
}
但它只生成点而不是文本

然后我尝试使用创建带有文本的图像,然后将其插入pdf。所以我试过了

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")
}
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或图像


谢谢。

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

err := pdf.OutputFileAndClose("test.pdf")
if err != nil {
    log.Fatal(err)
}
除此之外,你的第一个例子对我很有用。生成的输出如下所示:

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

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
工具生成)都在当前目录中。如果您可以确认这对您有效,您可以继续将它们移动到fonts目录中,并相应地更改代码。我最好的猜测是,您可能正在默默地忽略一个关于这些文件之一的错误警告

PS我正在运行Mac OS X。如果您在另一个系统上,请确保安装了支持西里尔文字的Helvetica版本

更新

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

多亏了jung kurt,我找到了解决办法。您可以通过添加pdf.SetCompression(true)–Timur Shahmuratov在Windows上避免此错误


UTF-8是unicode。具体来说,它是一种8位的Unicode无损编码。所以这不是你的问题。谢谢你的回复。我在Windows10上,使用的字体是我复制到项目目录的字体。json映射也来自于此。我在pdf.OutputFileAndClose上没有收到错误。字体可能位于单独的文件夹“font”中吗?@TimurShahmuratov-Hmm,那么我不知道。您是否需要在系统上安装字体?我不确定PDF是否生成错误,或者您的系统是否只是无法正确显示。Windows 10上可能没有Helvetica。您可以尝试的另一件事是在您知道支持西里尔文字的字体上使用makefont工具,然后使用生成的文件运行代码。除此之外,我没有主意了,对不起!在MacOSX上测试代码。是的,它与Windows中使用的字体相同。生成的pdf文件不同。报告了一个问题