LODOP!LODOP!!LODOP!!!(喊三遍啊喊三遍~)


声明:本文转载自https://my.oschina.net/alfie/blog/1577832,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

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

上图第一张,出来的第一版打印的JS代码(部分):

完了,写完一个以后,眼睛看哪里晃来晃去的都是数字~  ***de,全是各种 TOP LEFT  WIDTH HEIGHT 

必须的想想办法,吃了个中饭好好理了理思绪,想了想我要达到的目的:

  1. 摆脱数字,这么数来数去的计算位置,不行,效率太低下,应该要全部自动的生成,对于我么这种开发工(ma)程(nong)师来说不应该把时间浪费在这种事情上面(说白了,其实就是懒~)
  2. 对象化,上图那种代码,写位置不好算不说,写完了以后要维护,也是各种头大,包你一打开先要傻眼一会儿,咱也要面向对象编程的,是不?这才是咱工(ma)程(nong)师应该干的事
  3. 有对象那肯定就得有结构,于是乎根据一餐中饭想下来的思路,白板上画出来了一个版草稿

(请忽略左上角那块抹布,请忽略字写得有点丑~,请。。。)

后面事实证明,上面这张图确实只是一餐中饭拍脑袋临时拍出来的而已,不过大概的框架结构就出来了,回头拿笔细化梳理了一下,整体思路就出来了:(上图就不解释,看不懂也不解释)

首先得有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的............

本文发表于2017年11月23日 14:33
(c)注:本文转载自https://my.oschina.net/alfie/blog/1577832,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 6164 讨论 1 喜欢 9

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1