分頁
分頁本質(zhì)上說就是計算分頁線的位置。其過程如下:
1.首先計算出標準頁的高度,也就是紙張高度減去上下頁邊距的值,還需要考慮到頁眉頁腳的修正量。
2.設(shè)置當前分頁線的位置,也就是上一個分頁線的位置加上標準頁高。
3.遍歷文檔行,若分頁線的位置在文檔行中間,說明該行文字被分割到兩頁中,此時將分頁線的位置向上移動,使得分頁線在當前文檔行的上邊緣和上一個文檔行下邊緣的中間。
4.如此循環(huán),使得所有的文檔頁的高度和大于等于文檔的內(nèi)容高度。
在進行分頁時,也需要判斷很多邊界條件,比如當某個文檔行非常高,比如中間放置了一個超高的圖片,使得這個文檔行的高度大于標準頁高,此時就不能隨便移動分頁線的位置了。
另外當文檔中有表格時,則需要深入到表格單元格內(nèi)部進行修正分頁線位置的操作,這是一種遞歸操作。
在電子病歷業(yè)務(wù)中有著繼續(xù)打印的功能,在筆者的實現(xiàn)中,續(xù)打位置實際上就算是一種特殊的分頁線,這樣就能避免在續(xù)打時文字被分割打印的情況。
文字斷行和排版算法是非常復(fù)雜的,即使筆者經(jīng)過長期的重構(gòu)再重構(gòu),優(yōu)化再優(yōu)化,也還是花費了一萬多行的C#代碼來實現(xiàn)這個功能,而且還有不少地方仍然需要優(yōu)化。
一些人認為C#無法開發(fā)高性能的程序,編輯器這樣程序應(yīng)該需要用C++開發(fā)。筆者經(jīng)過實踐認為,所謂C#性能不高的說法是不對的,關(guān)鍵還是算法。C#程序只是啟動有些慢,運行起來后仍然可以達到很高的性能。