179 lines
4.6 KiB
C#

using QuestPDF.Fluent;
using QuestPDF.Helpers;
using QuestPDF.Infrastructure;
using System.Runtime.InteropServices;
using Microsoft.Extensions.Logging;
namespace YD_Event.Application.Certificate;
/// <summary>
/// 证书字体助手 - 可靠的中文字体处理
/// </summary>
public static class CertificateFontHelper
{
private static bool _fontConfigured = false;
private static readonly object _lock = new();
private static string _selectedFont = null;
/// <summary>
/// 配置 QuestPDF 中文字体
/// </summary>
public static void ConfigureFonts(ILogger logger)
{
if (_fontConfigured) return;
lock (_lock)
{
if (_fontConfigured) return;
try
{
logger.LogInformation("开始配置 QuestPDF 中文字体...");
// 设置许可证
QuestPDF.Settings.License = LicenseType.Community;
// 检测并选择中文字体
_selectedFont = FindAvailableChineseFont(logger);
if (!string.IsNullOrEmpty(_selectedFont))
{
logger.LogInformation($"成功选中中文字体: {_selectedFont}");
}
else
{
logger.LogWarning("未找到中文字体,将使用默认字体");
}
_fontConfigured = true;
logger.LogInformation("QuestPDF 字体配置完成");
}
catch (Exception ex)
{
logger.LogError(ex, "配置字体时出错");
}
}
}
/// <summary>
/// 查找可用的中文字体
/// </summary>
private static string FindAvailableChineseFont(ILogger logger)
{
var fontList = GetFontCandidates();
foreach (var font in fontList)
{
try
{
logger.LogDebug($"尝试字体: {font}");
if (TestFont(font))
{
logger.LogInformation($"字体可用: {font}");
return font;
}
}
catch (Exception ex)
{
logger.LogDebug(ex, $"字体测试失败: {font}");
}
}
return null;
}
/// <summary>
/// 获取字体候选列表(按优先级排序)
/// </summary>
private static string[] GetFontCandidates()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
return new[]
{
"Microsoft YaHei", // 微软雅黑
"SimHei", // 黑体
"SimSun", // 宋体
"Microsoft YaHei UI",
"Segoe UI",
"Arial Unicode MS"
};
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
return new[]
{
"WenQuanYi Zen Hei",
"WenQuanYi Micro Hei",
"Noto Sans CJK SC",
"Noto Sans SC",
"DejaVu Sans",
"Droid Sans Fallback"
};
}
else
{
return new[]
{
"PingFang SC", // macOS
"Heiti SC",
"STSong",
"Arial Unicode MS"
};
}
}
/// <summary>
/// 测试字体是否可用
/// </summary>
private static bool TestFont(string fontName)
{
try
{
using var stream = new MemoryStream();
Document.Create(container =>
{
container.Page(page =>
{
page.DefaultTextStyle(x => x.FontFamily(fontName));
page.Content().Text("测试中文 Test");
});
}).GeneratePdf(stream);
return stream.Length > 0;
}
catch
{
return false;
}
}
/// <summary>
/// 获取选中的字体
/// </summary>
public static string GetSelectedFont()
{
return _selectedFont;
}
/// <summary>
/// 应用字体到文本样式
/// </summary>
public static TextStyle ApplyFont(TextStyle style)
{
if (!string.IsNullOrEmpty(_selectedFont))
{
try
{
return style.FontFamily(_selectedFont);
}
catch
{
// 如果字体应用失败,使用默认字体
}
}
return style;
}
}