type TSFontWare = class public function Create(pdf); function Init(); function UseBuiltInFont(); function SetSubstitutionRules(source, target); function GetFont(name, bold, italic); private function GetExternalFont(name, bold, italic); function GetBuiltInFont(name, bold, italic); private pdf_; is_linux_; // 是否是linux use_built_in_font_; // 是否使用内置字体 substitution_rules_; // 替换规则 external_reference_; external_font_cache_; end; function TSFontWare.Create(pdf); begin pdf_ := pdf; is_linux_ := true; use_built_in_font_ := false; substitution_rules_ := array("宋体": "SimSun", "黑体": "SimHei"); external_reference_ := array(); external_font_cache_ := array(); // self.Init(); end; function TSFontWare.UseBuiltInFont(); begin use_built_in_font_ := true; end; function TSFontWare.Init(); begin {$IFDEF LINUX} is_linux_ := true; {$ELSE} is_linux_ := false; {$ENDIF} separator := is_linux_ ? "/" : "\\"; path := extractFileDir(sysExecName()) + separator + "funcext" + separator + "WordToPdf" + separator + "fonts" + separator; files := fileList("", path + "*.tt*"); for i:=0 to length(files)-1 do begin filename := files[i]["FileName"]; ext := extractFileExt(filename); pos := pos(ext, filename); name := is_linux_ ? filename[:pos-1] : ansiToUTF8(filename[:pos-1]); external_reference_[name] := array("ext": ext, "path": path + filename); end end; function TSFontWare.GetExternalFont(name, bold, italic); 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, bold, italic); begin return use_built_in_font_ ? self.GetBuiltInFont(name, bold, italic) : self.GetExternalFont(name, bold, italic); end; function TSFontWare.GetBuiltInFont(name, bold, italic); 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, target); begin substitution_rules_[source] := target; end;