程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Fastreport3.14的中文PDF輸出

Fastreport3.14的中文PDF輸出

編輯:Delphi

  參考 《讓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]  ... 下一頁  >> 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved