.net6 webApi中使用FastReport中自定义字体中文乱码问题
原因分析:
刚开始用fastReport设计模版时,模版字体全部都用了宋体,在往模版里面填充数据转换成pdf的过程中,转换出来的pdf上上标的负号显示不出来,而且0和O也区分不了,于是乎,我就换了个字体,换成了时代新罗马,结果负号可以正常显示了,接着问题又来了,由于一个text框中可能包含英文和中文,不知道是设计器创建出来的报文本身就有问题还是什么,用时代新罗马字体预览pdf时,pdf上的中文乱码,按理来说时代新罗马这个字体是可以显示中文的,至今我也没想明白,既然中文显示不了,那就造个字体吧,这个字体是黑体和时代新罗马的结合,这样text文本框就可以实现既显示中文,也显示时代新罗马字体。
字体问题是解决了,接着又来问题了,使用自定义字体,在程序里面加载fastReport设计的报文时直接报错了(数据类型溢出),我当时使用的是2023.2.7的nuget包,于是乎,我换了个版本2024.2.8,问题完美解决了。ok,程序跑起来,问题全部解决了,pdf完美显示,于是乎我直接把程序更新到了线上,结果另外一天,客户问我:“哎呀,pdf怎么还加密了呀”,我到线上一看,好家伙,pdf上的中文全部乱码了。
解决方案:
不知道什么问题,安装到服务器的字体fastReport好像识别不了,但是我把字体安装到服务器之后,权限啥的都给了,至今我任然想不明白,既然识别不了那就直接把字体放到项目文件中吧,结果,成了!!!
using FastReport;
using FastReport.Export.Pdf;
using FastReport.Utils;
using Microsoft.AspNetCore.Mvc;
namespace WebApplication2.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpPost(Name = "GetWeatherForecast")]
public FileStreamResult Get()
{
LogToFile("Wayne Ener");
try
{
// 创建一个 FastReport 报表对象
Report report = new Report();
//我们从文件夹中获取所需字体的文件
var fonts = Directory.GetFiles("Fonts");
//每种字体都添加到报表生成器配置中
foreach (var font in fonts) { Config.PrivateFontCollection.AddFontFile(font); }
// 加载报表模板
var templatePath = ".\\Reports\\测试模版.frx"; // 替换为你的模板文件路径
report.Load(templatePath);
report.Prepare();
// 创建一个内存流来存储生成的 PDF 数据
MemoryStream ms = new MemoryStream();
// 将报表导出为 PDF 格式,并将结果写入到内存流中
var export = new PDFExport { EmbeddingFonts = true };
report.Export(export, ms);
// 设置内存流的位置为开头,以便于读取
ms.Position = 0;
return new FileStreamResult(ms, "application/pdf")
{
FileDownloadName = "report.pdf"
};
}
catch (Exception ex)
{
LogToFile( ex.Message);
throw; // 或者处理异常的逻辑
}
}
[HttpGet(Name = "GetWeatherForecast")]
public string Get2()
{
return "666";
}
private void LogToFile(string logMessage)
{
string logFilePath = ".\\Logs\\log.txt"; // 替换为你想要存储日志的文件路径
try
{
using (StreamWriter writer = new StreamWriter(logFilePath, true))
{
writer.WriteLine(logMessage);
writer.Close();
}
}
catch (Exception ex)
{
Console.WriteLine($"Failed to write log to file: {ex.Message}");
}
}
}
}
参考链接
http://techsoft3d.evget.com/index/newsdetail/id/44771