翼度科技»论坛 编程开发 .net 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

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


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

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

各个部分的图片替换处理逻辑是一样的,都是首先根据传递的参数名称,来设置图片的路径即可。
 
2、动态根据数据库配置的图片地址,进行参数处理

FastReport报表呈现,可以赋值参数,以及数据源等,我们可以通过再数据库获取到图片信息后赋值给参数名称,以及数据记录作为数据源绑定到报表即可,如下是相关的处理代码。
  1. //定义参数和数据格式
  2. var dict = new Dictionary<string, object>();
复制代码
然后封装一个根据医生名称,读取里面的数据库图片地址的函数,如下所示。
  1.         /// <summary>
  2.         /// 获取医生的签名图片,如果没有,则返回空图片文件
  3.         /// </summary>
  4.         /// <param name="doctorName">医生姓名</param>
  5.         /// <returns></returns>
  6.         private string GetDoctorSign(string doctorName)
  7.         {
  8.             //转换为物理路径
  9.             string signImage = "/Report/EmptySign.png";
  10.             var signImagePath = Server.MapPath(signImage);
  11.             if(!string.IsNullOrEmpty(signImage))
  12.             {
  13.                 var signInfo = BLLFactory<DoctorSign>.Instance.FindSingle($"DoctorName='{doctorName}'");
  14.                 if(signInfo != null && !string.IsNullOrEmpty(signInfo.PicturePath))
  15.                 {
  16.                     signImagePath = signInfo.PicturePath;
  17.                 }
  18.             }
  19.             return signImagePath;
  20.         }
复制代码
接着就是把这些图片地址作为对应医生的参数赋值到字典集合。
  1.     //相关医生签名图片
  2.     dict.Add("SignChufang", GetDoctorSign(info.ShopDoctor));
  3.     dict.Add("SignShenfang", GetDoctorSign(info.CheckPharmacistName));
  4.     dict.Add("SignTiaopei", GetDoctorSign(info.Tiaopei));
  5.     dict.Add("SignFuhe", GetDoctorSign(info.Fayao));
复制代码
而处方单的记录,我们可以构建一个DataTable的数据集合,根据数据库记录写入DataTable赋值即可。
  1. var dt = DataTableHelper.CreateTable("ProductName,Quantity|int,Unit,Specification,HowTo,Frequency,UseAmount");
复制代码
  1. foreach (var item in detailList)
  2. {
  3.     var dr = dt.NewRow();
  4.     var displayName = item.ProductName;
  5.     if(!string.IsNullOrEmpty(item.Specification))
  6.     {
  7.         displayName += $"({item.Specification})";
  8.     }
  9.     dr["ProductName"] = displayName;
  10.     dr["Quantity"] = item.Quantity;
  11.     dr["Unit"] = item.Unit;
  12.     dr["Specification"] = item.Specification;
  13.     dr["HowTo"] = item.HowTo;
  14.     dr["Frequency"] = item.Frequency;
  15.     dr["UseAmount"] = item.UseAmount;
  16.     dt.Rows.Add(dr);
  17. }
复制代码
有了参数和数据源,赋值给报表对象进行处理即可,如下代码。
  1.     //刷新数据源
  2.     report.RegisterData(dt, "Detail");
  3.     foreach (string key in dict.Keys)
  4.     {
  5.         report.SetParameterValue(key, dict[key]);
  6.     }
  7.     //运行报表
  8.     report.Prepare();
复制代码
最后使用PDFExport生成PDF文件,如下所示。
生成PDF文件,我们在服务端的API接口返回路径给pdf.js前端处理显示。
  1. //导出PDF的相对文件路径
  2. string exportPdfPath = string.Format("/GenerateFiles/Pres/NewReport_{0}.pdf", id);
  3. //转换为物理路径
  4. string realPath = Server.MapPath(exportPdfPath);
  5. var export = new PDFExport();
  6. report.Export(export, realPath);
  7. report.Dispose();
复制代码
最后报表的H5界面显示效果如下。

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

来源:https://www.cnblogs.com/wuhuacong/p/18291466
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具