分享一个自定义打印套打方案(一),概述

最近项目中需要实现单据套打的功能,实现后,留此日记以备忘,同时为有类似需求的同学提供一种解决方案.

原始需求:

1. 打印模板支持灵活自定义,支持可视化设置(含设置打印项是否打印,及位置,大小,字体等…).

2. 支持自定义打印项.

3. 常规的打印项设置(如自动打印小计/合计,表头表尾等…)

4. 在设置模板的时候,支持实时预览.

首先,先上个图, 给大家看一下打印套打模板的大致效果图,各位同学看着顺眼再往下看.

接下来,我们简单的来讨论一下如何实现这个需求,简单分析一下,在这个功能中,可能需要存在以下角色对象.

1. 打印项: 姑且暂称为 PrintItem ,我们不难发现至少应该具备以下属性: 标签名称, 数据源, 宽度, 高度, 字体, 颜色, 对齐方式, 打印坐标(表明细区域可能为打印位置索引)…

2. 打印模板数据: 姑且暂称为 BillPrintData , 为了简单起见,我们可以将这个打印模板数据拆分为 表头, 表体, 表尾,因为表头和表尾在控制上行为基本上是一致的,由此我们很自然的衍生出来了 表头表尾 以及 中间的”表体 ”这两个对象.

3. 表头表尾: 姑且暂称为 BillHeaderOrBottom ,不难看出,其理所应当的应该包含一个打印项集合,一个为这些打印项赋值的数据源. 以及这个区域的大小和其实坐标位置.

4. 表体即中间表格部分,姑且暂称为 BillGridBody, 具有和 BillHeaderOrBottom 一样的内容,同时还应该有设置那些行需要小计/合计.

5. 打印控制器,姑且暂称为  BillPrinter , 主要功能为加载打印格式,同时根据参数配置,控制输出到打印机.

有了上面的简单分析,我们来简单画一下这个需求的类结构图.

有了上面这些分析,下面我们一起来看下如何来实现这个功能.考虑到需要给大家讲明白具体怎么实现,可能篇幅会比较长,故会我们将此功能点分成以下几个文章片段来介绍.

1. 为了支持模板可视化设置,我们需要处理一个可支持鼠标随意拖动的容器控件,为了简单,这里以扩展Panel作为示例.----分享一个自定义打印套打方案(二).

2. 设计器面板.----分享一个自定义打印套打方案(三).

3. 格式的保存与加载.----分享一个自定义打印套打方案(四).

4. 打印的实现.----分享一个自定义打印套打方案(五).

分享一个自定义打印套打方案(一),概述

时间: 2024-09-30 15:26:00

分享一个自定义打印套打方案(一),概述的相关文章

分享一个自定义打印套打方案(二),扩展Panel,以支持鼠标随意拖动

接上一章节,本篇主要介绍一种支持鼠标随意拖动Panel内部控件位置的方法.为了简单起见,这里我们不妨就暂称我们将要扩展的Panel容器名称为 MoveControlPanel,该容器至少需要实现以下功能 1. 识别当前鼠标位置,是否处于某个内部组件的边框位置,以让鼠标显示出对应的图标(拉伸,移动-) 2.移动鼠标以改变内部某个组件的大小及坐标, 3.保存容器内每个组件的当前坐标及大小. 为了便于描述当前光标状态,我们不妨定义一个枚举.姑且称其为 EMousePointPosition, 其至少应

分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容

分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容 在写JS的过程中,为了调试我们常常会 写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS 的运行情况,但发布时又因为IE不支持console,又要去掉这些代码,一不小心就会出错 问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.

分享一个自定义的 console 类,让你不再纠结JS中的调试代码的兼容

问题的产生 在写JS的过程中,为了调试我们常常会写很多 console.log.console.info.console.group.console.warn.console.error代码来查看JS的运行情况,但发布时又因为IE不支持console,又要去掉这些代码,一不小心就会出错. 本文分享自己昨晚写的一个console类来试图解决这一问题.当然,更好的做法是把测试代码分开写,那样就不会有这个问题. 解决思路 如何解决IE下不兼容的问题呢,那就是我们自己定义一个console类来覆盖浏览器

分享一个PDF打印控件

控件CLSID A04AC669-CB70-4E8B-9CC0-9B73FC153784 功能描述 自己写的一个控件,某人寿公司的需求,可惜最后没用到. 需求如下: 1.给你一个一个PDF文档,让你打印该文档,且不同页从打印机的不同纸盒出纸(需求真是千奇百怪). 接口如下: /************************************************/ //发送打印任务到打印队列 //参数: strPath-> 文件路径 // pageFrom-> 打印开始页 // pa

等保2.0来了,分享一个可落地的等保建设方案

企业在安全方面最关注的其实是业务安全.数据安全与安全检查,这篇文章来讲解一下我对于等保过检的经验与建设. 不同于其他建设文章,本文会给出很多落实方面的建议与方法,希望企业可以通过这篇文章,顺利通过过检任务,并保证安全的投入成本与收益的比率. 一.管理 一个企业的安全性最终体现在管理与运营,随着安全越发受重视,企业在安全管理方面也要与时俱进. 1拓扑图 很多人把拓扑图分类到技术中,但我更愿意把拓扑图分类到管理中,因为可以通过拓扑图一目了然的知道企业中每个设备的使用,每个区域的划分都很明确,过检中过

WPF打印原理,自定义打印

一.基础知识 1.System.Printing命名空间 我们可以先看一下System.Printing命名空间,东西其实很多,功能也非常强大,可以说能够控制打印的每一个细节,曾经对PrintDialog失望的我看到了一丝曙光. 2.PrintDialog 可以看到PrintDialog除了构造函数有三个方法和一堆属性,PrintDocument接受一个分页器(DocumentPaginator,稍后介绍),PrintVisual可以打印Visual,也就是WPF中的大部分继承自Visual类的

分享一个换肤解决方案

最近有朋友问到在winform程序上要做换肤功能的话,该如何处理,刚好前一段时间在项目中主导了程序换肤的这个功能.那就借这个机会整理一下,以分享给有需要的朋友. 1. 在winform程序上换肤,需要处理的涉及到每个控件及窗体.熟悉前端的朋友应该知道,在网页上实现换肤主要通过在每个元素上定义指定的标识符(如class,id等特性),然后页面通过加载不同的样式文件去渲染不同的皮肤效果,其实在winform程序中实现的思想应该是一致. 2.如上描述,我们可能需要定制使用到的每个控件,以便能读取指定的

跟我一起学extjs5(40--增加一个自定义模块[1建立表和bean文件])

跟我一起学extjs5(40--增加一个自定义模块[1建立表和bean文件]) 经过上面的工作,一个独立模块的CRUD已经可以运行了,为了更好的可以看到其他自定义功能,我们做一个自定义的独立模块,这个模块中包括了各种的数据类型. 新增一个"销售合同"的独立模块,模块名称为Agreement,里面包括了20几个字段,把主要的字段类型都设置了,有字符串型,整型,浮点型,金额型,日期型,布尔型,百分比,还包括计算字段. 建立表的sql语句如下: /****** 对象: Table [dbo]

Flex 自定义打印控件编写

打印历来是web应用一个比较棘手的问题,幸好flex web应用是运行在flash player上的,flash player可以访问打印机,所以flex 应用可以实现比较强大的打印功能.Flex 自身提供的printjob.flexprintjob相对来说用起来不是很方便,对于有严格纸张设置.翻页等打印需求,略显功能不足,因此需要基于printjob或flexprintjob来完善flex的打印功能,及自定义打印控件. 本控件核心为: 1)PrintManager,打印控制核心类 2)IPri