Ruport中pdf_writer對中文的支援並不好,輸出的中文顯示的是亂碼。上網查了很多資料,也沒有找到好的解決方案,無奈只好查看原始碼,到底為什麼Ruport內建的PDF工具不支援中文輸出。
Ruport::Formatter::PDF::Writer中找到以下代碼
metrics = load_font_metrics(font)
metrics = PDF::Writer::FontMetrics.open(font)
PDF::Writer::FontMetrics::METRICS_PATH = [ File.join(File.dirname(File.expand_path(__FILE__)), 'fonts') ]
原來METRICS_PATH=%RUBY_HOME%/lib/ruby/gems/1.8/gems/pdf-writer-1.1.8/lib/pdf/writer/fonts
在此路徑下存在的afm字型檔均不支援中文,於是開始將目標轉向添加一個支援中文的 *.afm字型檔。無奈檔案找到了,放到該路徑下,運行竟報錯了(也許是PDF_WRITER不支援該檔案)
放棄了此方法,把目標轉向FPDF
1)下載fpdf http://download.csdn.net/source/5608
2)解壓到Rails項目的lib下
3)按Ruby Roport實踐—簡單報表系統完成Ruport應用
4)接下來,修改ReportOutputController.rb
將 class Ruport::Formatter::PDF修改為如下內容
class Ruport::Formatter::FPDF < Ruport::Formatter::PDF<br /> def pdf_writer<br /> unless @pdf_writer<br /> @pdf_writer = ::FPDF.new<br /> @pdf_writer.extend(PDF_Chinese)<br /> @pdf_writer.AddPage<br /> @pdf_writer.AddGBFont<br /> @pdf_writer.SetFont('GB','', options[:font_size] || 16)<br /> end<br /> return @pdf_writer<br /> end</p><p> def render_pdf<br /> output << pdf_writer.Output<br /> end</p><p>end<br /> class Pdf < Ruport::Formatter::FPDF<br /> renders :pdf, :for => BaseSqlController<br /> build :data_sheet do<br /> eval(options[:pdfContent])<br /> end<br /> end
5)修改資料表report_templates中template_content內容為
pdf_writer.SetFont('GB','B',10)<br /> pdf_writer.SetLeftMargin(80)<br /> pdf_writer.Cell(40,10,Iconv.conv('GB2312','UTF-8','產品報表2'))<br /> pdf_writer.Ln()<br /> pdf_writer.SetFont('GB','',8)<br /> pdf_writer.Cell(40,5,Iconv.conv('GB2312','UTF-8','名稱'),1,0,'C')<br /> pdf_writer.Cell(40,5,Iconv.conv('GB2312','UTF-8','類別'),1,0,'C')<br /> pdf_writer.Cell(40,5,Iconv.conv('GB2312','UTF-8','價格'),1,0,'C')<br /> pdf_writer.Ln()<br /> data.each do |p|<br /> pdf_writer.Cell(40,5,Iconv.conv('GB2312','UTF-8',p.title),1)<br /> pdf_writer.Cell(40,5,Iconv.conv('GB2312','UTF-8',p.description),1)<br /> pdf_writer.Cell(40,5,p.price.to_s,1)<br /> pdf_writer.Ln()<br /> end
報表效果: