最近项目中需要实现单据套打的功能,实现后,留此日记以备忘,同时为有类似需求的同学提供一种解决方案.
原始需求:
1. 打印模板支持灵活自定义,支持可视化设置(含设置打印项是否打印,及位置,大小,字体等…).
2. 支持自定义打印项.
3. 常规的打印项设置(如自动打印小计/合计,表头表尾等…)
4. 在设置模板的时候,支持实时预览.
首先,先上个图, 给大家看一下打印套打模板的大致效果图,各位同学看着顺眼再往下看.
接下来,我们简单的来讨论一下如何实现这个需求,简单分析一下,在这个功能中,可能需要存在以下角色对象.
1. 打印项: 姑且暂称为 PrintItem ,我们不难发现至少应该具备以下属性: 标签名称, 数据源, 宽度, 高度, 字体, 颜色, 对齐方式, 打印坐标(表明细区域可能为打印位置索引)…
2. 打印模板数据: 姑且暂称为 BillPrintData , 为了简单起见,我们可以将这个打印模板数据拆分为 表头, 表体, 表尾,因为表头和表尾在控制上行为基本上是一致的,由此我们很自然的衍生出来了 表头表尾 以及 中间的”表体 ”这两个对象.
3. 表头表尾: 姑且暂称为 BillHeaderOrBottom ,不难看出,其理所应当的应该包含一个打印项集合,一个为这些打印项赋值的数据源. 以及这个区域的大小和其实坐标位置.
4. 表体即中间表格部分,姑且暂称为 BillGridBody, 具有和 BillHeaderOrBottom 一样的内容,同时还应该有设置那些行需要小计/合计.
5. 打印控制器,姑且暂称为 BillPrinter , 主要功能为加载打印格式,同时根据参数配置,控制输出到打印机.
有了上面的简单分析,我们来简单画一下这个需求的类结构图.
有了上面这些分析,下面我们一起来看下如何来实现这个功能.考虑到需要给大家讲明白具体怎么实现,可能篇幅会比较长,故会我们将此功能点分成以下几个文章片段来介绍.
1. 为了支持模板可视化设置,我们需要处理一个可支持鼠标随意拖动的容器控件,为了简单,这里以扩展Panel作为示例.----分享一个自定义打印套打方案(二).
2. 设计器面板.----分享一个自定义打印套打方案(三).
3. 格式的保存与加载.----分享一个自定义打印套打方案(四).
4. 打印的实现.----分享一个自定义打印套打方案(五).
分享一个自定义打印套打方案(一),概述