You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需手动添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:23:21