golang 用西里尔字母创建 pdf
golang create pdf with cyrillic
我需要使用西里尔符号创建 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 或图像?
谢谢。
首先,您忽略了最后一行中的一个错误。 pdf.OutputFileAndClose
returns 一个错误,所以你应该检查它:
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
工具)都在当前目录中。如果您可以确认这对您有用,您可以继续将它们移动到字体目录中并相应地更改代码。我最好的猜测是,您可能会默默地忽略有关这些文件之一的错误警告。
PS 我是 运行 Mac OS X。如果您使用的是另一个系统,请确保您安装了支持西里尔字符的 Helvetica 版本.
更新
对于以后遇到这个问题的其他人,我想在这里添加最终的解决方案。来自以下评论:
Thanks to jung-kurt I found solution. You can avoid this bug on Windows by adding pdf.SetCompression(true) – Timur Shahmuratov
我需要使用西里尔符号创建 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 或图像?
谢谢。
首先,您忽略了最后一行中的一个错误。 pdf.OutputFileAndClose
returns 一个错误,所以你应该检查它:
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
工具)都在当前目录中。如果您可以确认这对您有用,您可以继续将它们移动到字体目录中并相应地更改代码。我最好的猜测是,您可能会默默地忽略有关这些文件之一的错误警告。
PS 我是 运行 Mac OS X。如果您使用的是另一个系统,请确保您安装了支持西里尔字符的 Helvetica 版本.
更新
对于以后遇到这个问题的其他人,我想在这里添加最终的解决方案。来自以下评论:
Thanks to jung-kurt I found solution. You can avoid this bug on Windows by adding pdf.SetCompression(true) – Timur Shahmuratov