參考 《讓Fastreport3.x支持中文PDF的輸出》一文,確實可以支持中文。但是發現兩個問題:
1、只能在Adobe Reader下打開,在Foxit Reader下空白。
2、用Adobe Acrobat或者Adobe Reader打開時提示rebuild,關閉時提示save
研究了一下Fastreport3.14和3.07的源代碼,發現關於字體這部分重新調整了。在3.07下,每個type0的字體有三個obj表示,而在3.14下只用兩個obj(把FontDescriptor放進實際字體中去了)。3.14中源代碼中有個小bug,漏掉了實際字體obj的ref(原frxPDFfile.pas的985行和986行之間)。Foxit Reader應該是嚴格按照ref去找obj的,找不到obj,所以顯示不出來。Adobe Reader應該不是按ref找的,能夠正常顯示漢字,但是它會重新ref,所以提示rebuild。
修改後的TfrxPDFFont.SaveToStream替換原來的即可。
鑲入字體還不行。有時間再說。3.15的說明中有說增強了PDF導出的功能,期待中。
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.PixelsPerInch := 96;
b.Canvas.Font.Size := 750;
i := GetOutlineTextMetrics(b.Canvas.Handle, 0, nil);
GetMem(pm, i);
try
try
GetOutlineTextMetrics(b.Canvas.Handle, i, pm);
FirstChar := Ord(pm.otmTextMetrics.tmFirstChar);
LastChar := Ord(pm.otmTextMetrics.tmLastChar);
FontName := StringReplace(Font.Name, ' ', '#20', [rfRepla
[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一頁 >>