上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 文件问题 > FastReport导出PDF乱码的解决办法-pdf文件打开是乱码

FastReport导出PDF乱码的解决办法-pdf文件打开是乱码

作者:上犹日期:

返回目录:文件问题

程序员在使用FastrReport控件导出PDF时,时常会出现报表文字乱码的情况,是由于程序读取中文字体名称时错误,导致写入到PDF文件中的字体名称错误,所以当用Adobe Acrobat等PDF阅读器打开PDF时,要读取PDF文件中的字体名称,从而调用系统中对应的安装字体来展示时就会报错。

找到FastReport安装包中的“frxExportPDF.pas”文件,

FastReport导出PDF乱码的解决办法

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只适合单字节的字符长度。

相关阅读

关键词不能为空
极力推荐

电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

关于我们