2016-02-10 55 views
1

我需要用西里爾文符號創建pdf文件。我已經開始使用https://github.com/jung-kurt/gofpdf,但它需要1251個符號才能生成正確的西里爾文。 我試過golang用西里爾文創建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") 
} 

但它只產生點而不是文字。

然後我試着用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或圖像?

謝謝。

+0

UTF-8是unicode。具體來說,它是Unicode的8位無損編碼。所以這不是你的問題。 – LinearZoetrope

回答

0

首先,您忽略了最後一行中的錯誤。 pdf.OutputFileAndClose返回一個錯誤,所以你應該檢查一下:

err := pdf.OutputFileAndClose("test.pdf") 
if err != nil { 
    log.Fatal(err) 
} 

其他,你的第一個例子爲我工作。生成的輸出是這樣的:

PDF Output

這裏是我使用的代碼,你會看到它非常類似於你:

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.jsoncp1251.map(從$GOPATH/src/github.com/jung-kurt/gofpdf/font或由makefont工具生成)都在當前目錄中。如果您可以確認這適用於您,則可以繼續將它們移動到字體目錄並相應地更改代碼。我最好的猜測是,你可能會默默地忽略一個錯誤,警告你關於這些文件之一。

PS我正在運行Mac OS X.如果您在另一個系統上,請確保安裝了帶有西里爾字符支持的Helvetica版本。

更新

對於其他人今後面臨這個問題,我想在這裏補充的最終解決方案。從下面的評論:

感謝jung-kurt我找到解決方案。您可以通過添加pdf.SetCompression(true)來避免Windows上的此錯誤。 - Timur Shahmuratov

+0

感謝您的回覆。我在Windows 10上,並使用了我複製到項目目錄的https://github.com/jung-kurt/gofpdf/tree/master/font中的字體。 json地圖也來自那裏。我在pdf.OutputFileAndClose上沒有收到任何錯誤。難道是字體位於單獨的文件夾「字體」? –

+0

@TimurShahmuratov嗯,那我不知道。難道你需要在你的系統上安裝字體嗎?我不確定PDF是否生成不正確,或者您的系統是否無法正確顯示。您可能沒有在Windows 10上使用Helvetica。您可以嘗試的另一件事是在您知道支持西里爾語文本的字體上使用makefont工具,然後使用這些生成的文件運行代碼。除此之外,我沒有想法,對不起! –

+1

在Mac OSX上測試的代碼。是的,它可以在Windows中使用相同的字體。生成的pdf文件不同。報告了一個問題https://github.com/jung-kurt/gofpdf/issues/64 –