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

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

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

1、报表上的设计处理

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

 

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

不过在报表是在服务器上生成图片的方式,导致正常出来的图片,却没有变化字体,导致出来的是正常的宋体格式。

因此考虑使用图片的格式方式来处理。在其中放置Picture控件,如下所示。

调整好Picture控件的高度和宽度,让它在设计的空白上合适的展示即可。

为了实现图片格式的显示,我们需要在报表的图片控件的BeforePrint事件中解析数据(来自传递参数),数据格式为Base64字符串(从Byte数据转换),如下代码所示。

namespace FastReport
{
  public class ReportScript
  {
    private void shopDoctorImg_BeforePrint(object sender, EventArgs e)
    {
      var img = GetImage("ShopDoctor");
      if(img != null){
        shopDoctorImg.Image=img;  
      }
    }   
    private void tiaopeiImg_BeforePrint(object sender, EventArgs e)
    {    
      var img = GetImage("Tiaopei");
      if(img != null){
        tiaopeiImg.Image=img;  
      }
    }       
    private void CheckDoctorImg_BeforePrint(object sender, EventArgs e)
    {
      var img = GetImage("CheckDoctor");
      if(img != null){
        CheckDoctorImg.Image=img;  
      }
    }
    private void CheckPharmacistImg_BeforePrint(object sender, EventArgs e)
    {       
      var img = GetImage("CheckPharmacist");
      if(img != null){
        CheckPharmacistImg.Image=img;  
      }
    }
    private Image GetImage(string signName)
    {         
      Image img = null;
      string imgStr = (string)Report.GetParameterValue(signName);
      if(!string.IsNullOrEmpty(imgStr))
      {
        byte[] imgData= Convert.FromBase64String(imgStr);
        using(MemoryStream ms = new MemoryStream(imgData))
        {
          img = System.Drawing.Image.FromStream(ms);            
        }
      }
      return img;
    }
        
  }
}

其中主要注意的是,我们传递的图片数据需要采用Base64String的格式才能正常传递和展示。

2、报表传递图片数据

完成了报表的设计处理,我们剩下的就是在实际的报表中传递对应的参数数据了。

我们把签名图片,放在相对的目录上,如下所示。

然后编写一个公用的读取图片为Base64String的函数处理,如下所示。

//通过姓名获取签名图片的Base64
        private string GetSignImage(string signName)
        {
            var result = "";
            string imagePath = Path.Combine(baseDir, $"Report/signs/{signName}.png");
            if (File.Exists(imagePath))
            {
                var stream = FileUtil.FileToStream(imagePath);
                var image = FileUtil.StreamToBytes(stream);
                if (image != null)
                {
                    result = Convert.ToBase64String(image);
                }
            }
            return result;
        }

接着就是根据对应的报表进行加载,并设置相关的参数进行传递给报表即可,如下测试代码所示。

//生成PDF报表文档到具体文件
    Report report = new Report();
    report.Load(reportFile);
    //定义参数和数据格式
    var dict = new Dictionary<string, object>();
    #region 测试数据源
    dict.Add("Name", "张三");
    dict.Add("Gender", "男");
    dict.Add("Age", 32);
    dict.Add("Telephone", "18620292076");
    dict.Add("CreateTime", "2019-10-13 22:30:15");
    dict.Add("CheckDoctor", GetSignImage("张医生"));//"张医生"
    dict.Add("CheckPharmacist", GetSignImage("张医生")); //"李药师"
    dict.Add("SendUser", "王小姐");
    dict.Add("QrCode", "http://www.iqidi.com");
    dict.Add("BarCode", "1234567890");
    //图片文件
    dict.Add("ShopDoctor", GetSignImage("张医生"));
    dict.Add("Tiaopei", GetSignImage("张医生"));
    dict.Add("Fayao", GetSignImage("王小姐"));    
    #endregion
    
    report.RegisterData(dt, "Detail");
    foreach (string key in dict.Keys)
    {
        report.SetParameterValue(key, dict[key]);
    }
    //运行报表
    report.Prepare();

由于我们的报表,最终是生成PDF或者图片的方式,方便客户进行在线查询的,因此可以选择PDF或者图片的格式生成。

//运行报表
    report.Prepare();    
    
    //导出PDF报表
    //PDFExport export = new PDFExport();
    //多个图片导出
    int count = 1;
    string firstFileName = exportImgPath.Replace(".png", "");
    foreach (PageBase item in report.Pages)
    {
        string fileName = string.Format("{0}_{1}.png", firstFileName,  count);
        exportImgPath = fileName;
        //Resolution= 300可以提高分辨率
        report.Export(new ImageExport() { PageRange = PageRange.Current, CurPage = count, Resolution= 300 }, fileName);
        count++;
    }

最后生成的图片格式如下所示,顺利吧签名的图片贴在对应的单元格中即可。

 

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

相关文章
|
关系型数据库 数据安全/隐私保护 PostgreSQL
Windows环境下安装PostgreSQL
Windows环境下安装PostgreSQL
1435 0
|
缓存 API 定位技术
使用Python调用百度地图API实现地址查询
使用Python调用百度地图API实现地址查询
1763 0
|
4月前
|
SQL 关系型数据库 MySQL
EXPLAIN 执行计划:一眼看穿你的SQL慢在哪
数据库小学妹带你轻松掌握SQL性能诊断!通过EXPLAIN查看执行计划,精准识别索引失效、全表扫描(ALL)、key为NULL等瓶颈。聚焦type、key、rows等6个关键字段,结合实战案例与避坑指南(如函数滥用、最左前缀破坏),让优化有的放矢。学完即用,告别盲目调优!
|
6月前
|
人工智能 数据可视化 网络安全
零基础必看:2026年OpenClaw(Clawdbot)阿里云一键部署教程+接入iMessage指南
在AI自动化工具爆发的2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自然语言指令+多场景任务自动执行”的核心优势,成为新手小白追捧的“专属数字员工”——它无需专业编程基础,就能实现文件管理、联网搜索、多平台协同等多样化功能,而阿里云轻量服务器推出的OpenClaw一键部署方案,更是彻底打破了新手的入门壁垒,预置专属镜像、自动化配置环境,全程可视化操作,哪怕你完全不懂技术、不懂服务器,跟着步骤也能15-20分钟完成部署,部署后还能快速接入iMessage,实现手机、Mac端随时随地操控AI,解锁高效办公与便捷生活新方式。
610 2
|
9月前
|
SQL JSON 数据库
SQL Server Management Studio (SSMS) 22 正式版发布 - 微软数据库管理工具
SQL Server Management Studio (SSMS) 22 正式版发布 - 微软数据库管理工具
1290 0
SQL Server Management Studio (SSMS) 22 正式版发布 - 微软数据库管理工具
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
1080 3
C# 中关于补位的写法 PadLeft,PadRight 函数
C# 中的 `PadLeft` 和 `PadRight` 是 String 类提供的用于字符串补位的实用方法。`PadLeft` 在字符串左侧填充指定字符,使其达到指定长度;`PadRight` 则在右侧填充。两者通过检查原字符串长度,计算需填充字符数,并创建新字符数组完成操作。时间复杂度为 O(n),适用于简单补位场景,但在大量操作时需注意性能影响。示例代码展示了如何使用这两个方法进行补位操作。
|
SQL 开发框架 关系型数据库
基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
|
SQL JSON 关系型数据库
17.6K star!后端接口零代码的神器来了,腾讯开源的ORM库太强了!
"🏆 实时零代码、全功能、强安全 ORM 库 🚀 后端接口和文档零代码,前端定制返回 JSON 的数据和结构"
368 1
|
API C#
在.NET中使用QuestPDF高效地生成PDF文档
在.NET中使用QuestPDF高效地生成PDF文档
857 0