關於Jaspersoft iReport打印引起內存溢出的問題的思考(僅作爲一點猜想,歡迎有更精通的人批評指正)

在工作中有用到Jaspersoft iReport打印組件打印PDF文檔的情況,但是有時候做好的模板文件部署到服務器(本地或者遠程),打印時會引起內存溢出的問題,這個時候檢查方向分兩條線:1)打印設值的問題 2)模板元素的問題。
首先1)打印設值的問題,要檢查模板對應的字段在設值類裏是否爲空,是否有無限循環的可能,是否有重名,2)模板元素的問題,這個需要檢查元素的屬性的詳細設置,比如我遇到的下面這種情況:
在這裏插入圖片描述
被保險人銀行客戶編號與投保人銀行客戶編號兩個元素框挨的比較近,因爲設置屬性的時候考慮到被保險人銀行客戶編號這個值的不確定性,所以把這個元素框的屬性設置爲Print When Detail Overflows=true(打鉤),而且Stretch With Overflow=true(打鉤)在這裏插入圖片描述
本來這樣考慮也合情理,當元素內容超長時,元素框肯定顯示不下,只能顯示出框內的部分,所以設置超長的內容也打印出來,同時爲了美觀將元素框設置自動延展包容超長的內容。
Print When Detail Overflows這個設置爲true倒也沒有什麼,頂多就是內容有可能與其他文字重疊了,但是Stretch With Overflow設置爲true則會帶來一個隱藏的風險,就是元素框自適應內容的超長而延展後,有可能它的定位座標X,Y的起始位置延伸到其他元素框內部去了,原則上在同一個層面每個元素框的座標起點與長寬限定的範圍內只能表達一個元素,如果在同一層面有其他元素框的起點和邊長在另一個已知元素的內部,那麼在當元素框的邊長設置爲固定值的時候這兩個元素都能顯示出來,只是可能內容有重疊的部分,但是當設置元素邊框Stretch With Overflow=true的時候,這個元素是一個純動態的字段元素,而且編譯的時候無法確定邊長的終止範圍,只能在運行的時候檢測動態字段的長度來確定,那麼當它延伸到其他元素範圍內的時候,這個元素和其他元素該怎麼確定顯示的內容呢?固定元素邊框的那個字段要用範圍內的像素顯示固定的內容,動態邊框的那個元素要佔用這個固定邊框元素的部分像素顯示其他的內容,一個要寫固定的,一個要改寫固定的其中一部分,這樣來回調度低層資源或者同時等待資源,就表現爲打印的過程非常緩慢或者半天沒有響應,然後過了一段時間後臺就報OOM了。
像我上面的例子,在取消被保人銀行客戶編號的Print When Detail Overflows和Stretch With Overflow之後,打印就正常顯示了,複測過幾次,也沒有再出現問題。
所以關於Print When Detail Overflows=true和Stretch With Overflow=true的用法還是需要注意以下幾點的:
1)在動態字段元素框分佈的不是太密旁邊也有空白空間的時候,設置這兩個屬性爲true能夠很好的展示動態字段內容
2)在同一個層面上如果要在同一塊像素區域類顯示兩個不同的動態字段內容,設置這兩個動態字段爲固定邊長,Print When Detail Overflows和Stretch With Overflow選項留空
3)對第二點的優化,同一個像素區域顯示不同的內容,要分成兩層顯示(設置前景背景),如果要在同一個區域顯示三種及其以上的內容,這時候就像if嵌套一樣,要考慮修正需求的合理性,或者採用其他替換的方式展示(比如合併其中兩項爲一層)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章