如何无需手动添加Blob字段在Crystal Reports中动态生成QR图片
Crystal Reports动态生成S3 QR图片解决方案
1. 现有C#代码修改要点
原代码通过新建多列的DataTable存储QR图片,不符合「无需添加新列拖拽」的需求,修改如下:
- 移除新建
QrParams表的全部逻辑,直接在原数据集P_DATA_CUR中新增一个byte[]类型的列(命名为QR_IMAGE) - 遍历
P_DATA_CUR的每一行,用当前行的FILE_NAME(S3对象Key)拉取图片字节,存入新增的QR_IMAGE列 - 最终直接将
P_DATA_CUR绑定到报表,无需额外设置副表数据源
修改后的完整代码:
var ds = db.GET_UNIFIED_GOVS(P_LICN_CIVIL_ID, P_LICN_CENTRAL_NO); var P_DATA_CUR = ds.Tables["P_DATA_CUR"]; // 给原数据表添加存储QR图片字节的字段 P_DATA_CUR.Columns.Add("QR_IMAGE", typeof(byte[])); // 遍历每一行填充QR图片 foreach (DataRow row in P_DATA_CUR.Rows) { string qrObjectKey = row["FILE_NAME"].ToString(); // 调用S3获取图片字节的方法 var imageBytes = new AwsFile() { objectKey = qrObjectKey }.GetImageBytesS3(); row["QR_IMAGE"] = imageBytes; } // 绑定数据集到报表 eReg_Crystal.Rpt.RptGET_UNIFIED_GOVS_Test cr = new Rpt.RptGET_UNIFIED_GOVS_Test(); cr.SetDataSource(P_DATA_CUR);
2. QR图片放置区域
- 如果每条数据记录对应一个独立的QR码,必须放在详细资料区(Details Section),报表会自动循环为每一行数据渲染对应的QR图片
- 报表页脚是整个报表的末尾固定区域,页面页脚是每页底部的固定区域,均不适合实现每条记录对应一个QR的循环显示
3. 用Dummy Image实现循环生成
Crystal Reports需要占位图来绑定动态图片字段,操作步骤:
- 打开报表设计器,拖拽「图片」控件到详细资料区,插入任意本地图片作为占位(Dummy Image)
- 右键图片控件 → 选择「设置图形位置」
- 在弹出窗口中选择「数据库字段」,找到
P_DATA_CUR表下的QR_IMAGE字段,确认后保存报表 - 运行报表时,Dummy Image会自动被每一行对应的QR图片字节替换,实现循环生成
4. C#向Crystal Reports传递URL并生成图片的分步操作
注:Crystal Reports无法直接通过S3 URL拉取图片,需在C#中先转换为字节再传递,步骤如下:
- 步骤1:从数据库获取包含S3对象Key(即业务中的URL/文件名)的数据集
P_DATA_CUR - 步骤2:给
P_DATA_CUR新增byte[]类型的字段(如QR_IMAGE),用于存储图片字节 - 步骤3:遍历数据集每一行,用S3对象Key调用
GetImageBytesS3方法获取图片字节,存入新增字段 - 步骤4:将填充完成的数据集绑定到Crystal Reports报表对象
- 步骤5:在报表设计器中用Dummy Image绑定到新增的
QR_IMAGE字段,实现循环显示
内容的提问来源于stack exchange,提问作者ahmed salah abd elaziz elbarba
相关产品推荐
相关产品推荐

