type TSFontWare = class public function Create(pdf: PdfFile); function GetFont(name: string; bold: boolean; italic: boolean); function UseExternalFont(); function SetSubstitutionRules(source: string; target: string); function SetDefaultSz(value: real); function GetDefaultSz(); private function GetExternalFont(name:string; bold: boolean; italic: boolean); function GetBuiltInFont(name:string; bold: boolean; italic: boolean); private [weakref]pdf_: PdfFile; is_linux_: boolean; // 是否是linux use_built_in_font_: boolean; // 是否使用内置字体 substitution_rules_: array of string; // 替换规则 external_reference_: array of string; default_sz_: real; end; function TSFontWare.Create(pdf: PdfFile); begin pdf_ := pdf; use_built_in_font_ := true; substitution_rules_ := array("宋体": "SimSun", "黑体": "SimHei"); external_reference_ := array(); default_sz_ := 10.5; end; function TSFontWare.SetDefaultSz(value: real); begin default_sz_ := value; end; function TSFontWare.GetDefaultSz(); begin return default_sz_; end; function TSFontWare.UseExternalFont(); begin use_built_in_font_ := false; end; function TSFontWare.GetExternalFont(name:string; bold: boolean; italic: boolean); begin if ifnil(name) or name = '' then name := "等线"; if not ifnil(external_font_cache_[name]) then return external_font_cache_[name]; value := external_reference_[name]; if ifnil(value) then return nil; // if ifnil(value) then raise name + " is unsupported font."; if value["ext"] = ".ttf" then font_name := pdf_.LoadTTFontFromFile("", value["path"], true); else if value["ext"] = ".ttc" then font_name := pdf_.LoadTTFontFromFile2("", value["path"], 0, true); // if not ifString(font_name) then raise "Load font error : " + format("%x", font_name); if not ifString(font_name) then return nil; font := pdf_.GetFont(font_name, "UTF-8"); external_font_cache_[name] := font; return font; end; function TSFontWare.GetFont(name: string; bold: boolean; italic: boolean); begin return use_built_in_font_ ? self.GetBuiltInFont(name, bold, italic) : self.GetExternalFont(name, bold, italic); end; function TSFontWare.GetBuiltInFont(name: string; bold: boolean; italic: boolean); begin font_name := substitution_rules_["name"]; if ifnil(font_name) then font_name := "SimSun"; if bold and italic then font_name += ",BoldItalic"; else if bold then font_name += ",Bold"; else if italic then font_name += ",Italic"; font := pdf_.GetFont(font_name, "GBK-EUC-H"); return font; end; function TSFontWare.SetSubstitutionRules(source: string; target: string); begin substitution_rules_[source] := target; end;