程序员在使用FastrReport控件导出PDF时,时常会出现报表文字乱码的情况,是由于程序读取中文字体名称时错误,导致写入到PDF文件中的字体名称错误,所以当用Adobe Acrobat等PDF阅读器打开PDF时,要读取PDF文件中的字体名称,从而调用系统中对应的安装字体来展示时就会报错。
找到FastReport安装包中的“frxExportPDF.pas”文件,
2.找到函数GetFontName,用一下的代码,替换原函数中的代码
function TfrxPDFFont.GetFontName: AnsiString;
var
s: AnsiString;
function HexEncode7F(Str: WideString): AnsiString;
var
s: AnsiString;
t: AnsiString; //添加一个变量
Index, Len: Integer;
begin
s := '';
t := Str; //将字体名称赋值给该变量,此时就将参数字体名称的widestring类型转换为AnsiString,因为很多字体是中文
//字体,汉字是双字节,所以用Asnsistring类型进行长度判断时才能正确显示字体的长度
//例:字符串“ 宋体”A:Length(widestring)=2 B: Length(ANSIString)=4,所以根据长度来判断
//是否为汉字时,因为字符串长度的差异,导致读取汉字的错误,
//用widestring传递字符时,Length(widestring)是不能真实反应字符串的长度的,
//特别是针对汉字韩文日文等双字节字体时,仅能反应英文德文等单字节字符串
Len := Length(t); //获取字体名称字符串长度
Index := 0;
while Index < Len do
begin
Index := Index + 1;
if Byte(t[Index]) > $7F then //当ASCII码的值大于$7F时,表示该字符是汉字的某一个字节
//如果是汉字的某一个字节,则添加#将连个字节连接,形成双字节已正确显示汉字,
s := s + '#' + AnsiString(IntToHex(Byte(t[Index]), 2))
else
//如果不是汉字(单字节字符)则直接根据序号读取字符串中的字符,
s := s + AnsiString(t[Index]);
end;
Result := s;
end;
3.然后重新编译该安装包后,重新安装FastReport即可。
原因就是判断汉字字体名称长度时(注:汉字为双字节字符),AnsiString才能正确获得汉字长度,原函数中的WideString只适合单字节的字符长度。
本文暂时没有评论,来添加一个吧(●'◡'●)