在一些报表模块中,需要我们根据用户操作的名称,来动态根据人员姓名,更新报表的签名图片,也就是电子手写签名效果,本篇随笔介绍一下使用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设计的报表,可以重用在多个终端上,非常方便。

使用FastReport报表动态更新人员签名图片的更多相关文章

  1. 基于Python实现matplotlib中动态更新图片(交互式绘图)

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  2. iOS 利用 Framework 进行动态更新

    http://nixwang.com/2015/11/09/ios-dynamic-update/ 前言 目前 iOS 上的动态更新方案主要有以下 4 种: HTML 5 lua(wax)hotpat ...

  3. 使用FastReport报表工具生成图片格式文档

    之前我在随笔<使用FastReport报表工具生成报表PDF文档>介绍过使用FastReport.Net来根据报表模板进行生成PDF,以及随笔<使用FastReport报表工具生成标 ...

  4. FastReport报表控件使用技巧总结

    FastReport报表控件使用技巧总结 1.FastReport中如何访问报表中的对象? 可以使用FindObject方法. TfrxMemoView(frxReport1.FindObject(' ...

  5. WPF柱状图(支持数据库动态更新)

    之前我们讲到wpf组件基类以及组件开发,现在我们围绕之前的内容去开发一个组件. 效果图请加群查看,在群共享里面. 做出这个呢  是比较繁琐的. 首先要使用我们的基类 继承基类的模板自动生成如下几个文件 ...

  6. FastReport报表MVC显示步骤

    FastReport报表MVC使用步骤如下: 1.创建MVC网站项目 最终DEMO如下图所示 2.引用相关DLL FastReport.dll FastReport.Web.dll 3.Web.con ...

  7. FastReport报表设计(仔细看)

    FastReport报表设计 2011-06-16 16:56:19|  分类: 系统开发|举报|字号 订阅     下载LOFTER我的照片书  |     目录 5.1 前言 5.2 基本概念及操 ...

  8. FastReport报表设计

    [转载]FastReport报表设计 (2012-10-24 20:37:26) 转载▼ 标签: 转载   原文地址:FastReport报表设计作者:小黑 FastReport报表设计 目录 5.1 ...

  9. Android零基础入门第67节:RecyclerView数据动态更新

    列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ...

  10. 使用FastReport报表工具生成报表PDF文档

    在我们开发某个系统的时候,客户总会提出一些特定的报表需求,固定的报表格式符合他们的业务处理需要,也贴合他们的工作场景,因此我们尽可能做出符合他们实际需要的报表,这样我们的系统会得到更好的认同感.本篇随 ...

随机推荐

  1. typescript基础知识汇总

    JavaScript中所有事物(字符串.数值.数组.函数)都是对象,都有属性和方法.1.用函数定义对象,然后new对象实例.2.用Object定义并创建对象实例var o = new Object(t ...

  2. v-for比v-if优先级更高

    在V2当中,v-for的优先级更高,而在V3当中,则是v-if的优先级更高. 在V3当中,做了v-if的提升优化,去除了没有必要的计算, 但同时也会带来一个无法取到v-for当中遍历的item问题, ...

  3. windows 文件夹添加备注

    1,选中希望改动的文件夹,然后右键"单击",选择"属性"按钮. 2,打开"自定义"面板,选择"更改图标",将原来的默认文 ...

  4. ICESat-2 从ATL08中获取ATL03分类结果

    ICESat-2 ATL03数据和ATL08数据的分段距离不一致,ATL08在ATL03的基础上重新分段,并对分段内的数据做处理得到一系列的结果,详情见数据字典: ATL08 Product Data ...

  5. 【C#】字符串按条件替换关键字

    private string MyReplace(string json, string keyWord, string newWord, Func<string, string, bool&g ...

  6. MyBatis日志模块源码分析

    MyBatis源码的logging包下是日志模块的相关实现,Mybatis日志模块通过适配器模式和代理模式优雅的实现了SQL日志的输出功能. 一. 适配器模式实现了MyBatis对第三方日志框架的适配 ...

  7. HTML——文本域

    在 HTML 中,使用 <textarea> 标签来表示多行文本框,又叫做文本域.与其它 <input> 标签不同,<textarea> 标签是单闭合标签,它包含起 ...

  8. Prism IoC 依赖注入

    现有2个项目,SinglePageApp是基于Prism创建的WPF项目,框架使用的是Prism.DryIoc,SinglePageApp.Services是C#类库,包含多种服务,下面通过使用Pri ...

  9. 在Windows上运行Rainbond,10分钟快速安装

    前言 Windows 桌面运行 Rainbond,Windows 开发者的新选择. 经过适配Mac以后,Windows的适配也是成为了近期的小目标,经过不断地测试,不断地研究.最后也是达成了完美运行的 ...

  10. vue单个插槽

    当子组件模板只有一个没有属性的插槽时,父组件传入的整个内容片段将插入到插槽所在的 DOM 位置,并替换掉插槽标签本身. # 子组件 <div> <h2>我是子组件的标题< ...