让Fastreport3.x支持中文PDF的输出

本文介绍了如何修改FastReport 3.x的源代码,以支持中文PDF的正确输出。主要涉及到对frxPDFFile.pas文件的修改,通过编码转换函数确保字体名称正确,从而解决PDF导出时中文乱码的故障。
摘要由CSDN通过智能技术生成
 

转自大富翁论坛,至于如何重新编译可以参考《Fastreport 3.07 专业的安装及中文化》

Q:FastReport 3.x导出PDF乱码怎么解决?(中文乱码,英文没问题).
A:用下面这代码替换 frxPDFFile.pas 中原来的代码就可以了
已在enterprise(应该说是professional) 3.07下测试通过;
注意事项:字体内嵌的复选框不可选。

procedure TfrxPDFFont.SaveToStream(Stream: TStream);
var
  s: String;
  b: TBitmap;
  pm: ^OUTLINETEXTMETRIC;
  FontName: String;
  i: Cardinal;
  pfont: PChar;
  FirstChar, LastChar : Integer;
  MemStream: TMemoryStream;
  MemStream1: TMemoryStream;
  pwidths: PABC;
  Charset: TFontCharSet;

  // support DBCS font name encoding
  function EncodeFontName(AFontName: String): string;
  var
    s: string;
    Index, Len: Integer;
  begin
    // Add Begin by ijia 2004.12.20
    // 修正在简体系统下繁体字体名的问题
    // 只提供 MingLiU, PMingLiU --> 细明体, 新细明体的修正
    s:=UpperCase(AFontName);
    if Copy(s, 1, 7)='MINGLIU' then
      AFontName:='细明体';
   
    if Copy(s, 1, 8)='PMINGLIU' then
      AFontName:='新细明体';
    // Add end
    s := '';
    Len := Length(AFontName);
    Index := 0;
    while Index < Len do
    begin
      Index := Index + 1;
      if Byte(AFontName[Index]) > $7F then
        s := s + '#' + IntToHex(Byte(AFontName[Index]), 2)
      else
        s := s + AFontname[Index];
    end;
    Result := s;
  end;

begin
  inherited SaveToStream(Stream);
  b := TBitmap.Create;
  b.Canvas.Font.Assign(Font);
  b.Canvas.Font.Size := 750;
  i := GetOutlineTextMetrics(b.Canvas.Handle, 0, nil);
  GetMem(pm, i);
  GetOutlineTextMetrics(b.Canvas.Handle, i, pm);
  FirstChar := Ord(pm.otmTextMetrics.tmFirstChar);
  LastChar := Ord(pm.otmTextMetrics.tmLastChar);
  FontName := StringReplace(Font.Name, ' ', '#20', [rfReplaceAll]);
  s := '';
  if fsBold in Font.Style then
    s := s + 'Bold';
  if fsItalic in Font.Style then
    s := s + 'Italic';
  if s <> '' then
    FontName := FontName + ',' + s;

  Charset := pm.otmTextMetrics.tmCharSet;
  // Add by ijia 2004.12.20
  //if Charset = CHINESEBIG5_CHARSET then
  if Charset in [CHINESEBIG5_CHARSET, GB2312_CHARSET] then
    FontName := EncodeFontName(FontName)
  else
    FontName := Parent.PTool.PrepareString(FontName);

  Parent.XRefAdd(Stream);
  WriteLn(Stream, IntToStr(Index + Parent.FStartFonts) + ' 0 obj');
  WriteLn(Stream, '<<');
  WriteLn(Stream, '/Type /Font');
  WriteLn(Stream, '/Name /F' + IntToStr(Index - 1));
  WriteLn(Stream, '/BaseFont /' + EncodeFontName(FontName));

  // Add by ijia 2004.12.20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值