.net6 webApi中使用FastReport中自定义字体中文乱码问题

.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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值