前一段时间有一个ROR的小项目,需要输出PDF文件,于是到网上搜了一圈儿,最后选定了ruby版的fpdf(1.53d),特点:短小,实用。
但是使用过程中也碰到了一些小问题。中文问题,如果使用'GB'字体,中文可以正常显示,但是如果混入了数字或英文,格式很难看。
我发现在chinese.rb中还有一种叫'GB-hw'的字体,拿来一试,效果很好,只是chinese.rb中有两处bug需要修改。
第一处在87行后追加 cw = {},第二处在113行,原文是 l += cw[c],改成 l += cw[c.chr]就可以了。
再举一个使用的例子,首先在app\models目录下建一个gpdf.rb文件用来写页头和页脚的内容。
class Gpdf < FPDF
attr_accessor :title
# Page header
def Header
ic = Iconv.new('GBK', 'UTF-8')
# GB-hw bold 16
SetFont('GB-hw','',16)
# Title
Cell(0, 10, ic.iconv(@title), 0, 0, 'C')
# Line break
Ln(12)
end
# Page footer
def Footer
# Position at 1.5 cm from bottom
SetY(-15)
ic = Iconv.new('GBK', 'UTF-8')
# GB-hw italic 8
SetFont('GB-hw','',8)
# Page number
Cell(0, 10, ic.iconv('页 ') + PageNo().to_s + '/{nb}', 0, 0, 'C')
end
end
然后在Controller里像下面这么用就可以了。
pdf = Gpdf.new
pdf.title = '销售产品'
pdf.extend(PDF_Chinese)
pdf.AddGBhwFont
pdf.AliasNbPages
pdf.AddPage
ic = Iconv.new('GBK', 'UTF-8')
pdf.SetFont('GB-hw','',10)
pdf.Cell(55, 7, ic.iconv('金额123'), 1, 0, 'C')