利用FastReport传递图片参数,在报表上展示签名信息

一给  金牌会员 | 2022-10-14 17:11:23 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 541|帖子 541|积分 1623

在一个项目中,客户要求对报表中的签名进行仿手写的签名处理,因此我们原先只是显示相关人员的姓名的地方,需要采用手写方式签名,我们的报表是利用FastReport处理的,在利用楷体处理的时候,开发展示倒是正常效果,不过实际上在服务器运行的时候,出来的确实正规的宋体格式,相应的字体都已经安装,不过还是没有生效。因此采用变通的方式,在对应签名的地方采用图片的格式显示,实际效果达到要求。本篇随笔介绍这个过程,利用FastReport传递图片参数,在报表上展示签名信息的处理。
1、报表上的设计处理

例如我们要在报表落款的附近记录相关人员的名字,因此采用签名的显示方式会比较合理。

 
因此设计相关的报表,本来想是采用文本的方式,变化字体的方式来快捷实现的

 
 不过在报表是在服务器上生成图片的方式,导致正常出来的图片,却没有变化字体,导致出来的是正常的宋体格式。 
  
 因此考虑使用图片的格式方式来处理。在其中放置Picture控件,如下所示。
 
调整好Picture控件的高度和宽度,让它在设计的空白上合适的展示即可。 
为了实现图片格式的显示,我们需要在报表的图片控件的BeforePrint事件中解析数据(来自传递参数),数据格式为Base64字符串(从Byte数据转换),如下代码所示。
  1. namespace FastReport
  2. {
  3.   public class ReportScript
  4.   {
  5.     private void shopDoctorImg_BeforePrint(object sender, EventArgs e)
  6.     {
  7.       var img = GetImage("ShopDoctor");
  8.       if(img != null){
  9.         shopDoctorImg.Image=img;  
  10.       }
  11.     }   
  12.     private void tiaopeiImg_BeforePrint(object sender, EventArgs e)
  13.     {   
  14.       var img = GetImage("Tiaopei");
  15.       if(img != null){
  16.         tiaopeiImg.Image=img;  
  17.       }
  18.     }      
  19.     private void CheckDoctorImg_BeforePrint(object sender, EventArgs e)
  20.     {
  21.       var img = GetImage("CheckDoctor");
  22.       if(img != null){
  23.         CheckDoctorImg.Image=img;  
  24.       }
  25.     }
  26.     private void CheckPharmacistImg_BeforePrint(object sender, EventArgs e)
  27.     {      
  28.       var img = GetImage("CheckPharmacist");
  29.       if(img != null){
  30.         CheckPharmacistImg.Image=img;  
  31.       }
  32.     }
  33.     private Image GetImage(string signName)
  34.     {         
  35.       Image img = null;
  36.       string imgStr = (string)Report.GetParameterValue(signName);
  37.       if(!string.IsNullOrEmpty(imgStr))
  38.       {
  39.         byte[] imgData= Convert.FromBase64String(imgStr);
  40.         using(MemoryStream ms = new MemoryStream(imgData))
  41.         {
  42.           img = System.Drawing.Image.FromStream(ms);            
  43.         }
  44.       }
  45.       return img;
  46.     }
  47.         
  48.   }
  49. }
复制代码
其中主要注意的是,我们传递的图片数据需要采用Base64String的格式才能正常传递和展示。 
2、报表传递图片数据

完成了报表的设计处理,我们剩下的就是在实际的报表中传递对应的参数数据了。
我们把签名图片,放在相对的目录上,如下所示。
 
 然后编写一个公用的读取图片为Base64String的函数处理,如下所示。
  1.         //通过姓名获取签名图片的Base64
  2.         private string GetSignImage(string signName)
  3.         {
  4.             var result = "";
  5.             string imagePath = Path.Combine(baseDir, $"Report/signs/{signName}.png");
  6.             if (File.Exists(imagePath))
  7.             {
  8.                 var stream = FileUtil.<strong>FileToStream</strong>(imagePath);
  9.                 var image = FileUtil.<strong>StreamToBytes</strong>(stream);
  10.                 if (image != null)
  11.                 {
  12.                     result =<strong> Convert.ToBase64String</strong>(image);
  13.                 }
  14.             }
  15.             return result;
  16.         }
复制代码
接着就是根据对应的报表进行加载,并设置相关的参数进行传递给报表即可,如下测试代码所示。
  1.     //生成PDF报表文档到具体文件
  2.     Report report = new Report();
  3.     report.Load(reportFile);
  4.     //定义参数和数据格式
  5.     var dict = new Dictionary<string, object>();
  6.     #region 测试数据源
  7.     dict.Add("Name", "张三");
  8.     dict.Add("Gender", "男");
  9.     dict.Add("Age", 32);
  10.     dict.Add("Telephone", "18620292076");
  11.     dict.Add("CreateTime", "2019-10-13 22:30:15");
  12.     dict.Add("CheckDoctor", GetSignImage("张医生"));//"张医生"
  13.     dict.Add("CheckPharmacist", GetSignImage("张医生")); //"李药师"
  14.     dict.Add("SendUser", "王小姐");
  15.     dict.Add("QrCode", "http://www.iqidi.com");
  16.     dict.Add("BarCode", "1234567890");
  17.     //图片文件
  18.     dict.Add("ShopDoctor", GetSignImage("张医生"));
  19.     dict.Add("Tiaopei", GetSignImage("张医生"));
  20.     dict.Add("Fayao", GetSignImage("王小姐"));   
  21.     #endregion
  22.    
  23.     report.RegisterData(dt, "Detail");
  24.     foreach (string key in dict.Keys)
  25.     {
  26.         report.SetParameterValue(key, dict[key]);
  27.     }
  28.     //运行报表
  29.     report.Prepare();   
复制代码
由于我们的报表,最终是生成PDF或者图片的方式,方便客户进行在线查询的,因此可以选择PDF或者图片的格式生成。
  1.     //运行报表
  2.     report.Prepare();   
  3.    
  4.     //导出PDF报表
  5.     //PDFExport export = new PDFExport();
  6.     //多个图片导出
  7.     int count = 1;
  8.     string firstFileName = exportImgPath.Replace(".png", "");
  9.     foreach (PageBase item in report.Pages)
  10.     {
  11.         string fileName = string.Format("{0}_{1}.png", firstFileName,  count);
  12.         exportImgPath = fileName;
  13.         //Resolution= 300可以提高分辨率
  14.         report.Export(new ImageExport() { PageRange = PageRange.Current, CurPage = count, Resolution= 300 }, fileName);
  15.         count++;
  16.     }
复制代码
最后生成的图片格式如下所示,顺利吧签名的图片贴在对应的单元格中即可。

 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

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

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表