电子病历文本编辑器中文字断行及排版算法研究
扫描二维码
随时随地手机看文章
分页
分页本质上说就是计算分页线的位置。其过程如下:
1.首先计算出标准页的高度,也就是纸张高度减去上下页边距的值,还需要考虑到页眉页脚的修正量。
2.设置当前分页线的位置,也就是上一个分页线的位置加上标准页高。
3.遍历文档行,若分页线的位置在文档行中间,说明该行文字被分割到两页中,此时将分页线的位置向上移动,使得分页线在当前文档行的上边缘和上一个文档行下边缘的中间。
4.如此循环,使得所有的文档页的高度和大于等于文档的内容高度。
在进行分页时,也需要判断很多边界条件,比如当某个文档行非常高,比如中间放置了一个超高的图片,使得这个文档行的高度大于标准页高,此时就不能随便移动分页线的位置了。
另外当文档中有表格时,则需要深入到表格单元格内部进行修正分页线位置的操作,这是一种递归操作。
在电子病历业务中有着继续打印的功能,在笔者的实现中,续打位置实际上就算是一种特殊的分页线,这样就能避免在续打时文字被分割打印的情况。
文字断行和排版算法是非常复杂的,即使笔者经过长期的重构再重构,优化再优化,也还是花费了一万多行的C#代码来实现这个功能,而且还有不少地方仍然需要优化。
一些人认为C#无法开发高性能的程序,编辑器这样程序应该需要用C++开发。笔者经过实践认为,所谓C#性能不高的说法是不对的,关键还是算法。C#程序只是启动有些慢,运行起来后仍然可以达到很高的性能。