公司买了一套LODOP的打印,没办法,那就用呗,开始还没理会,后面因为特殊原因一接触,才发现一入LODOP深似海,从此掉入“钱”眼里。(钱么,数的都是数字,咱也是数的数字,看下面的截图,你就知道此处应该要省略几万字~~)
上图第一张,出来的第一版打印的JS代码(部分):

完了,写完一个以后,眼睛看哪里晃来晃去的都是数字~ ***de,全是各种 TOP LEFT WIDTH HEIGHT
必须的想想办法,吃了个中饭好好理了理思绪,想了想我要达到的目的:
- 摆脱数字,这么数来数去的计算位置,不行,效率太低下,应该要全部自动的生成,对于我么这种开发工(ma)程(nong)师来说不应该把时间浪费在这种事情上面(说白了,其实就是懒~)
- 对象化,上图那种代码,写位置不好算不说,写完了以后要维护,也是各种头大,包你一打开先要傻眼一会儿,咱也要面向对象编程的,是不?这才是咱工(ma)程(nong)师应该干的事
- 有对象那肯定就得有结构,于是乎根据一餐中饭想下来的思路,白板上画出来了一个版草稿
(请忽略左上角那块抹布,请忽略字写得有点丑~,请。。。)

后面事实证明,上面这张图确实只是一餐中饭拍脑袋临时拍出来的而已,不过大概的框架结构就出来了,回头拿笔细化梳理了一下,整体思路就出来了:(上图就不解释,看不懂也不解释)
首先得有Font对象,有Font就有Sentence,sentence组装成Paragraph,Paragraph组装成Doc
后面在编码的过程中,又加上了一个Row对象,来处理满行自动换行的问题,继续分析,发现LODOP的一个TEXT是统一绑定相关类型的,比如下划线、斜体这些,而我们一个Sentence或者是Paragraph的数据来源,有写死的也有从后台读取出来的数据一起拼起来的,比如(性别:男 )这种,我们必须切分,性别:为一个Stc,男又为一个Stc,那么 Row>Sentence来决定它的地位,而一个Stc就是对应的一个LODOP的PRINT_TEXT
最终整理的结果如下: Doc>Paragraph>Row>Sentence>Font
再分析下每个对象的结构,
Font 结构,应该有width,height,fontName,fontSize,bold,italic ...... 还应该有Font的设置方法,宽和高是根据fontSize自动生成的,那么我应该提供一个setFont的方法......
Sentence结构,应该有data,font,width,underLine,alignment.....
Paragraph结构,应该有 headSpace,top,left,rows[]...... 还要提供一个formart方法,把传入的rows整理一下,相关row没输出完毕,但是实际已经满行超出了,还得做切分工作
Doc结构,应该有Page,top,left,width,height,paragraphs[] , topNow ...... 它要提供setDoc方法,根据设置的纸张大小,来设置 top上边距,left左间距,同时设置有效文本输出宽度width,以及有效文本输出高度height (实际上就不用指定下边距和右边距了,这里指定宽度和高度,是更方便运算的)。还要提供一个输出打印的方法 write,这个方法作用就是循环所有的Paragraphs[],然后再取里面的rows[],继续取里面的sentences[],最后根据取得的相关参数,调用LODOP提供的打印方法,输出打印内容并设置相关参数,,,这个topNow很重要,记录文档当前打印的高度,贯穿整个文档的打印环节!就靠他决定每一个结构对象的TOP位置!
然后开始编码,,,,
发现一个Sentence的宽度在LODOP中打印用Font的宽度算出来不够,必须增加一个Font的宽度才行, 比如你是谁,三个字,你必须设置4个字的宽度,否则”谁“这个字就跳到下面一行去了,好,我加!
发现上面加上一个字的宽度后,和下一个Sentence距离就拉得很开,比如:“你是谁 我是我”,那么下一个Sentence的起始Left又得减去上一个Sentence的一个Font的宽度,好,我又减!
,,,,,,,,,,,,,,,,,,,,,,,,
此处省略一万只草泥马 ~
最终完事后,再增加几个特殊对象,比如图片的输出,比如横线的打印,比如提行(指定高度的提行!)等等 补充的几个打印对象 ......
OK,开始试着编写打印模板的JS,边写边改造和完善,,,,接下来是上改造完的代码时间:
首先我给当前需要打印的DOC分配一个font池,所有的打印TEXT都从这个池里面拿Font就行了,Doc初始化时候就初始出来

然后 初始化DOC




所有的段落和一些特殊对象都write完了后,就显示打印预览了

对应第一张代码截图,放一张改造后的截图:

默认A4 12号 仿宋 ,如果我全部用默认的,那么我什么都不需要设置,不用数数字的感觉是不是很爽!对象化了后,是不是有种一目了然的清爽的感觉?可读性大大增加了。(一句话占用一整行,我就认为它是一个段落Paragraph!)
如果不用默认设置,给个参考的设置:

哦忘了 还有特殊对象,比如说我要输出图片:

比如说我要打印一条横线:

比如说我要空20的高度

等等等等,后续慢慢补充了。。。有需求往上再加!@
OK 基本完事了,又可以睡个好觉了。
后续: 一看这JS,就知道我是写JAVA的............