使用JasperReports细节带调整页面高度

时间:2015-02-04 22:45:54

标签: jasper-reports

报告包含一个独特的中央“Detail1”区域,必须适合整个页面高度 - 即使数据源只提供一条记录 - 页脚必须保留在A4大小页面的底部:

 _______________
|    header     |
|               |
|    row1       |
|    row2       |
|               |
|               |
|               |
|               |
|               |
|   footer      |
|_______________|

YES!

 _______________
|    header     |
|               |
|    row1       |
|    row2       |
|   footer      |
|_______________|

NO!

我想知道这是与“拉伸”选项有关还是与背景有关。

1 个答案:

答案 0 :(得分:1)

我们还有一个更普遍的问题,即相对于页面高度垂直调整某些波段或内容的大小。 在你的情况下,它可以完成,例如,通过增加row2"底部边距"或footer"上边距" (或介绍一些" spacer元素" inbetween):

variant A    variant B   variant C
___________  __________  __________
|  header |  | header |  | header |
|_________|  |________|  |________|
|  row1   |  | row1   |  | row1   |
|_________|  |________|  |________|
|  row2   |  | row2   |  | row2   |
|    .    |  |________|  |________|
|    .    |  |    .   |  | spacer |
|_________|  |    .   |  |________|
|  footer |  | footer |  | footer |
|_________|  |________|  |________|

我目前能想到解决这个问题的唯一方法是一种黑客,如果"你对已经拉伸的元素兄弟姐妹的大小了解得足够多了#34;

我们想要设置spacer.height(或保证金取决于所选的变体),如下所示:

spacer.height = page.height - header.height - row1.height - row2.height - footer.height

示例A

为了简单起见,我们假设

  1. 只有row2.height是灵活的(〜动态)
  2. 为简单起见,我们说row2.height由数字分隔的数字组成,如下所示:

    17
    2
    34
    
  3. 使用 variant A ,我们可以手动测试,在下一页上推送页脚的行数/数量后,让我们说{{1} }

    所以我们所要做的就是

    • 动态调整5的底部边距为row2(例如,通过Groovy或Java)
    • 或者如果它基于某些SQL select,请填写一些空格行,如下所示:
    max( 0, 5 - row2LinefeedsCount * row2lineHeight )

    例B

    另一个例子可能是, -- (Oracle SQL) select ..., dyn_row2_col -- add additional linefeeds if necessary (when < 5 lines) -- (counts by the content length after removing all digits) || lpad( '', max( 0, 5 - length( regexp_replace( dyn_row2_col, '\d', '' ))), CHR(13) ) as dyn_row2_col, ... from ... 的高度是相关的,并且线性地增加了一些查询结果的子行数(例如,如果它是具有相同大小的行的简单子报告)。然后我们可以使用 row2 根据子行查询填充间隔(无形)和一些虚拟查询(并且计算剩余空间类似上面的例子)。

    搜索引擎标签/短语

    将条带高度调整为页面大小/高度,条带高度为页面大小的100%,最大高度,垂直拉伸至100%父容器高度或页面大小

    Jasper Reports的实施/使用想法

    我发现痛苦,不能轻易使用灵活的定位/大小调整表达式(例如让页脚粘到底部浮动元素在这个现代的flex布局HTML /响应式布局世界中,使用Jasper Reports水平(例如表格列)或variant C)。绝对定位理念应该在这里得到加强。 Eclipse BIRT 在这方面要好得多,但还有其他缺点。 当然,实施可能相当复杂,内存更紧密,速度更慢,但我认为非绝对定位要求场景的好处会很大。

    我写了一些通用的Scriptlet(我打算在 jasper-utils 中提供),它解决了相关列上基于命名组件样式(类似于CSS类)的水平列的浮动。它的行为与HTML表格非常相似,使用基于列特定百分比的可用水平空间和&#34; underflow-stretch-calc&#34;表达式和显示/隐藏列的可能性(在所有相关频段上)。