PdfConverter/utils/TSFontWare.tsf

101 lines
2.8 KiB
Plaintext

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;