使用 JasperReports 详细信息带调整页面高度

Fit page height with JasperReports detail band

报表包含一个独特的中央 "Detail1" 条带,该条带必须适合整个页面高度——即使数据源只提供一条记录——页脚必须保留在 A4 尺寸页面的底部:

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

YES!

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

NO!

我想知道这是否与 "stretching" 选项有关或与背景有关。

我们还有一个更普遍的问题,即相对于页面高度垂直调整某些区域或内容的大小。 在你的情况下,它可以完成,例如通过增加 row2 "bottom margin" 或 footer "top margin"(或在其间引入一些 "spacer element"):

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

我目前能想到的解决这个问题的唯一方法是 一种 hack,如果 "you know enough about the size of the to-be-streched element siblings"

我们想像这样设置 spacer.height(或边距取决于所选的变体):

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

示例 A

为了简单起见,我们假设

  1. 只有row2.height灵活(~动态)
  2. 为简单起见,我们假设 row2.height 由这样的换行符分隔的数字组成:

    17
    2
    34
    

使用variant A我们可以手动测试,多少linefeeds/numbers页脚会被推到下一页,让我们说 5.

所以我们要做的就是

  • 动态调整 row2 的下边距为 max( 0, 5 - row2LinefeedsCount * row2lineHeight )(例如通过 Groovy 或 Java)
  • 或者如果它是基于一些 SQL select,像这样填写一些空白 space 行:
    -- (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 ...

示例 B

另一个例子可能是,row2s 的高度是相关的,并且随着某些查询结果的子行数线性增加(例如,如果它是一个具有相同大小行的简单子报表)。然后我们可以使用 variant C 用一些基于子行的虚拟查询 填充 spacer(无形地)查询(并进行其余的计算 space 类似于上面的例子)。


搜索引擎tags/phrases

使条带高度适合页面 size/height,条带高度为页面大小的 100%,最大高度,垂直拉伸至父容器高度或页面大小的 100%


implementation/usage Jasper Reports 的想法

我发现无法轻松使用灵活的 positioning/sizing 表达式(例如 让页脚贴在底部水平浮动元素(例如 table 列)或 spacer.height: 75%)在这个现代弹性布局 HTML/responsive 布局世界中使用 Jasper Reports。这里应该加强绝对定位理念。 Eclipse BIRT 在这方面要好得多,但还有其他缺点。 当然实现起来可能比较复杂,内存比较大,速度也比较慢,但是我觉得在非绝对定位需求场景下好处会很大

写了一些通用的Scriptlet(打算在jasper-utils中提供),解决了基于命名组件样式的水平列的浮动(类似CSS 类) 在相关栏目上。它的行为与 HTML tables 非常相似,使用基于列特定百分比和 "underflow-stretch-calc" 表达式的可用水平 space 以及 show/hide 列的可能性(在所有相关频段上)。