[color=olive] 生成 支持 中文的的 pdf
最近有家 家具公司 叫我开发一个 B/S模式的管理软件,我使用的 ruby on rails
大家都知道 管理软件 使用频率最大 的 是 报表的打印 生成 excel表等操作,我对于delphi比较精通,delphi做起这些工作 就是把控件设置一下,属性设置,十几分钟就搞定,但是公司要求B/S模式.所以 就用 ruby喽 ,ruby on rails 做表格报表就不是那么简单,我google了很久找到一个 ruby report 的 插件,这个插件很好使用,很快我就能把报表打印出来,保存为csv格式有 excel打开,很好使用.但是很快就发现不支持中文,我本想在插件的源代码里面修改支持中文,结果折腾了半天还是不行,算了还是使用其他方法把.这个 ruport 不支持中文问的帖子不少可是没有几个人能给与解答的.如果想打印报表还是使用这个方法吧,生成的也是 pdf格式的.
首先下载,这个文件 http://brian.imxcc.com/fpdf/rfpdf153c.tar.gz. Extract ,
解压后把 fpdf.br的文件放在lib目录下面,在controller中调用就是了,下面的代码不用做任何修改,你就可以直接使用.
app/controllers/reports_controller.rb:
class ReportsController < ApplicationController
require 'fpdf'
require 'chinese'
def index
end
def pdf_report
# Data
col_sizes = [40,20,20,20]
data = [['编号','名称','邮箱','地址'],
['编号101','笋凤城','cheng','北京'],
['编号 5A','97','100','南昌'],
['编号 2','98','91','石家庄'],
['编号','89','84','九江'],
['编号 110','91','81','廊坊']]
send_data pdf_report_card(col_sizes, data),
:filename => "report.pdf",
:type => "application/pdf"
end
private
def pdf_report_card(col_sizes, data)
pdf = FPDF.new
pdf.AddPage
ic = Iconv.new("GB2312","utf-8")
pdf.AddPage
pdf.AddGBFont
pdf.SetFont('GB','',18)
pdf.SetFontSize(10)
pdf.SetFillColor(50,50,50)
pdf.SetTextColor(255)
pdf.SetDrawColor(0)
pdf.SetLineWidth(0.2)
# Table Header
i = 0
col_sizes.each do
pdf.Cell(col_sizes[i],7,ic.iconv(data[0][i]),1,0,'C',1)
i += 1
end
pdf.Ln()
pdf.SetFillColor(218,206,255)
pdf.SetTextColor(0)
pdf.SetFont('GB')
fill = 0
# Table Data
data[1..-1].each do |row|
pdf.Cell(col_sizes[0],6,ic.iconv(row[0]),'LR',0,'L',fill)
pdf.Cell(col_sizes[1],6,ic.iconv(row[1]),'LR',0,'L',fill)
pdf.Cell(col_sizes[2],6,ic.iconv(row[2]),'LR',0,'L',fill)
pdf.Cell(col_sizes[3],6,ic.iconv(row[3]),'LR',0,'C',fill)
pdf.Ln()
fill = (fill-1).abs % 2
end
# Bottom Table Border
total = 0
col_sizes.each {|x| total += x}
pdf.Cell(total,0,'','T');
pdf.Output
end
end
在你想打印的地方写上这个链接就 OK了.
app/views/reports/index.rhtml:
<h1>Report</h1>
<%= link_to 'Make PDF', :action => 'pdf_report' %>
当你下载这个插件的时候你重启一下 服务器. 这个方法绝对可以解决 不支持中文的问题.
对了你要是 重启服务器的时候,在 chinese.br 的
def GetMBStringWidth(s)
# Multi-byte version of GetStringWidth()
l=0
cw=@CurrentFont['cw']
nb=s.length
i=0
while i<nb
c=s[i]
# pp c
# if c.ord < 128 #这是源代码 他会报错 没有ord方法 那你就干脆不用
if c < 128
l += cw[c]
i += 1
else
l += 1000
i += 2
end
end
l*@FontSize/1000
end
一定要记住 "解压后把example目录外的文件放到项目的lib目录下 "
如果有什么问题,可以在这里留言,这个我折腾了好几个小时,算是弄明白了,希望能给同行同仁带来方便.[/color]
如果你们下不到的话,就是用下面我的附加中已经全部整理好的文件了.下载了直接使用就是了.