使用FastReport报表动态更新人员签名图片

在一些报表模块中,需要我们根据用户操作的名称,来动态根据人员姓名,更新报表的签名图片,也就是电子手写签名效果,本篇随笔介绍一下使用FastReport报表动态更新人员签名图片。

1、设计FastReport报表,使用图片来代替签名效果

例如我们设计了以上的FastReport报表,其中签字盖章哪里,我们用来图片组件来承载相关医生的电子签名,电子签名的图片,根据数据库记录的图片地址,进行生成时刻的替换即可。

报表以PDF的方式生成,手机端利用PDF.js库可以查看PDF文件。

我们看到以上的签字图片,设计的时候用一张默认图片代替效果,我们切换报表的C#代码部分,来实现报表签名的动态更新。

各个部分的图片替换处理逻辑是一样的,都是首先根据传递的参数名称,来设置图片的路径即可。

2、动态根据数据库配置的图片地址,进行参数处理

FastReport报表呈现,可以赋值参数,以及数据源等,我们可以通过再数据库获取到图片信息后赋值给参数名称,以及数据记录作为数据源绑定到报表即可,如下是相关的处理代码。

复制代码
//定义参数和数据格式
var dict = new Dictionary<string, object>();

然后封装一个根据医生名称,读取里面的数据库图片地址的函数,如下所示。

复制代码
        /// <summary>
        /// 获取医生的签名图片,如果没有,则返回空图片文件
        /// </summary>
        /// <param name="doctorName">医生姓名</param>
        /// <returns></returns>
        private string GetDoctorSign(string doctorName)
        {
            //转换为物理路径
            string signImage = "/Report/EmptySign.png";
            var signImagePath = Server.MapPath(signImage);
            if(!string.IsNullOrEmpty(signImage))
            {
                var signInfo = BLLFactory<DoctorSign>.Instance.FindSingle($"DoctorName='{doctorName}'");
                if(signInfo != null && !string.IsNullOrEmpty(signInfo.PicturePath))
                {
                    signImagePath = signInfo.PicturePath;
                }
            }
            return signImagePath;
        }

接着就是把这些图片地址作为对应医生的参数赋值到字典集合。

复制代码
    //相关医生签名图片
    dict.Add("SignChufang", GetDoctorSign(info.ShopDoctor));
    dict.Add("SignShenfang", GetDoctorSign(info.CheckPharmacistName));
    dict.Add("SignTiaopei", GetDoctorSign(info.Tiaopei));
    dict.Add("SignFuhe", GetDoctorSign(info.Fayao));

而处方单的记录,我们可以构建一个DataTable的数据集合,根据数据库记录写入DataTable赋值即可。

复制代码
var dt = DataTableHelper.CreateTable("ProductName,Quantity|int,Unit,Specification,HowTo,Frequency,UseAmount");
复制代码
foreach (var item in detailList)
{
    var dr = dt.NewRow();
    var displayName = item.ProductName;
    if(!string.IsNullOrEmpty(item.Specification))
    {
        displayName += $"({item.Specification})";
    }
    dr["ProductName"] = displayName;
    dr["Quantity"] = item.Quantity;
    dr["Unit"] = item.Unit;
    dr["Specification"] = item.Specification;
    dr["HowTo"] = item.HowTo;
    dr["Frequency"] = item.Frequency;
    dr["UseAmount"] = item.UseAmount;
    dt.Rows.Add(dr);
}

有了参数和数据源,赋值给报表对象进行处理即可,如下代码。

复制代码
    //刷新数据源
    report.RegisterData(dt, "Detail");
    foreach (string key in dict.Keys)
    {
        report.SetParameterValue(key, dict[key]);
    }

    //运行报表
    report.Prepare();

最后使用PDFExport生成PDF文件,如下所示。

生成PDF文件,我们在服务端的API接口返回路径给pdf.js前端处理显示。

复制代码
//导出PDF的相对文件路径
string exportPdfPath = string.Format("/GenerateFiles/Pres/NewReport_{0}.pdf", id);

//转换为物理路径
string realPath = Server.MapPath(exportPdfPath);

var export = new PDFExport();
report.Export(export, realPath);
report.Dispose();

最后报表的H5界面显示效果如下。

以上就是基于FastReport对报表处理的过程,FastReport还可以用在Winform、Vue的BS端,以及WPF应用程序上,我的博客里面都有相关的介绍,因此利用FastReport设计的报表,可以重用在多个终端上,非常方便。

相关推荐
慧都小妮子2 天前
FastReport将停止 .NET Framework 上的 WebReport 更新
.net·报表控件·fastreport
慧都小妮子3 天前
全新更新!FastReport .NET Delphi 和 Lazarus 产品更新至版本 2025.1
.net·报表控件·fastreport
慧都小妮子10 天前
全新更新!Fastreport.NET 2025.1版本发布,提升报告开发体验
.net·报表控件·fastreport
ufo20061 个月前
fastreport导出PDF后style bold粗体斜体等字体风格不显示的原因
pdf·delphi·fastreport
慧都小妮子2 个月前
如何在 FastReport .NET 中构建和安装 Postgres 插件
.net·报表控件·fastreport
慧都小妮子7 个月前
在报表控件 FastReport .NET 中使用 PageCreate 事件
.net·报表开发·报表控件·fastreport
慧都小妮子7 个月前
报表生成器FastReport .Net用户指南:脚本示例
microsoft·.net·报表开发·报表控件·fastreport
伍华聪8 个月前
在 PostgreSQL 中,解决图片二进制数据,由于bytea_output参数问题导致显示不正常的问题。
winform开发框架·开发辅助
慧都小妮子8 个月前
报表生成器FastReport .Net用户指南:关于脚本(上)
microsoft·.net·报表开发·报表控件·fastreport