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

简介: 使用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设计的报表,可以重用在多个终端上,非常方便。

 

专注于代码生成工具、.Net/.NetCore 框架架构及软件开发,以及各种Vue.js的前端技术应用。著有Winform开发框架/混合式开发框架、微信开发框架、Bootstrap开发框架、ABP开发框架、SqlSugar开发框架等框架产品。
 转载请注明出处:撰写人:伍华聪  http://www.iqidi.com

相关文章
|
搜索推荐 Java 数据库
基于SpringBoot校园二手书交易管理系统
基于SpringBoot校园二手书交易管理系统
C# DEV 关于设置gridview 指定单元格字体为红色
C# DEV 关于设置gridview 指定单元格字体为红色
|
6月前
|
数据采集 人工智能 安全
2026年AI Agent员工打造指南:阿里云及本地零成本部署OpenClaw(Clawdbot),解锁700+实用Skills
2026年,OpenClaw(原Clawdbot、Moltbot)凭借13万+GitHub Star的超高人气,成为打造私人AI员工的首选工具。但很多人部署后发现,裸奔的OpenClaw就像“聪明却无执行力的实习生”——能聊天、能推理,却无法独立完成代码部署、数据采集、自动化办公等实操任务。其实核心问题在于缺少“技能武装”:模型是AI的大脑,而Skills是AI的手脚,没有Skills的OpenClaw,只是一个空有智慧的“瘫痪天才”。
1095 5
|
机器学习/深度学习 存储 算法
Trinity-RFT:构建智能体持续学习的自动化强化微调工厂
大型语言模型作为智能体在真实环境中持续交互学习面临诸多挑战。 Trinity-RFT 是通义实验室推出的强化微调框架,旨在实现智能体的持续进化。它通过探索、训练与经验池的解耦设计,支持多样化训练模式,提升资源利用率和学习稳定性。同时,Trinity-RFT 提供灵活的数据处理与算法模块化功能,降低应用与研究门槛,助力迈向终身学习与自主进化的智能体时代。
1148 2
|
开发框架 前端开发 JavaScript
在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果
在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果
在WPF应用中实现DataGrid的分组显示,以及嵌套明细展示效果
|
开发框架 前端开发 JavaScript
ABP开发框架的技术点分析(1)
ABP开发框架的技术点分析(1)
|
设计模式 开发框架 前端开发
基于DevExpress的GridControl实现的一些界面处理功能
基于DevExpress的GridControl实现的一些界面处理功能
|
机器学习/深度学习 算法
【机器学习】揭秘反向传播:深度学习中神经网络训练的奥秘
【机器学习】揭秘反向传播:深度学习中神经网络训练的奥秘
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
1947 0

热门文章

最新文章