12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- package gofpdf
- import (
- "math"
- )
- // SplitText splits UTF-8 encoded text into several lines using the current
- // font. Each line has its length limited to a maximum width given by w. This
- // function can be used to determine the total height of wrapped text for
- // vertical placement purposes.
- func (f *Fpdf) SplitText(txt string, w float64) (lines []string) {
- cw := f.currentFont.Cw // 字符宽度
- wmax := int(math.Ceil((w - 2*f.cMargin) * 1000 / f.fontSize)) // 框的宽度
- s := []rune(txt) // Return slice of UTF-8 runes
- nb := len(s) // 字符长度
- // 去掉结尾的换行符
- for nb > 0 && s[nb-1] == '\n' {
- nb--
- }
- s = s[0:nb] //去掉结尾的换行符
- //sep := -1
- i := 0 // 遍历时的下标
- j := 0 // 换行时保留的上一行结束的位置
- l := 0 // 现在的长度
- // 遍历字符串(去掉换行符之后的)
- for i < nb {
- // 这里是为了防止内存溢出,曾出现过前面是汉字后面是非汉字,lines为["汉字汉字汉字","","","".....]无限个""导致内存溢出
- if len(lines) > len(s) {
- break
- }
- c := s[i] // 当前字符
- l += cw[c] // 当前需要的长度
- //if unicode.IsSpace(c) || isChinese(c) { // 判断是不是空格类字符和中文
- // sep = i
- //}
- // 如果换行或者超长了
- if c == '\n' || l > wmax {
- ///////////////
- // 如果第一个字就超宽了,别循环了,会死循环
- if i == 0 {
- break
- }
- //if sep == -1 {
- // if i == j {
- // i++
- // }
- // sep = i
- //} else {
- // ///////////////
- // //i = sep + 1
- // //////////////
- // i = sep
- //}
- lines = append(lines, string(s[j:i]))
- //sep = -1
- j = i
- i++
- l = 0
- } else {
- i++
- }
- }
- // 把最后一行补上
- if i != j {
- lines = append(lines, string(s[j:i]))
- }
- return lines
- }
|