BIRT报告每页的动态(背景)图像

时间:2011-12-06 15:46:31

标签: java pdf-generation birt

我想在使用Birt(2.5.2)生成的pdf文档中每页右侧垂直编写动态文本

这引出了两个可以独立解决的问题:

  1. 垂直书写
  2. 将它放在右侧的每个页面上(页眉和页脚无法帮助我)
  3. 问题1)

    我找不到垂直写文本的方法,因此我决定将文本放入JLabel,进行90度旋转,将图像写入ByteArrayOutputStream并使用byteArray将动态图像添加到报表中。 =>这已经有效,如果有一个我没想到的简单的3线解决方案,我会听取理由:)

    问题2)

    由于这个事实,页眉和页脚不能用于右侧或左侧的图像/文本,我的方法是使用背景图像并将其放在右侧。

    问题是,birt中的背景图片只能是网址或嵌入图片 要使用我生成的byteArray,我需要使用动态图像。

    现在我只能想到一个可能的解决方案:将生成的图像保存到具有唯一URL的临时文件夹中,将此图像添加为背景图像,然后将其删除。 但我认为应该有一个更容易的解决方案。

    ==>更新1

    我创建了一个两列布局,在右侧添加动态图像。我的报告最多有五页,因此我将图像放入其中五次,并在每张图像之前分页。这是有效的,结果如预期......还剩下一个新问题:

    在某些情况下,报告有3或4页,所以我需要隐藏最后的图像。我可以使用“reportContext.getPageVariable('pageNumber')”获取第一列报告末尾的页数,并将其保存到我自己的报告变量中。如果数字大于我的最后一页数,则五个图像中的每一个都得到数字1到5以及隐藏条件。

    现在我需要正确的位置来获取我的pageNumber:

    • 在第一列中的最后一个元素的渲染中获取正确的数字,但它的设置晚于我在第二列中使用它
    • 在渲染行时,返回始终为1,但在第二列
    • 中使用之前设置它
    • 添加第二行将返回正确的页码,但设置的时间晚于我在第二列中使用它

    有人知道怎么做吗?

    http://eclipse.org/birt/phoenix/deploy/reportScripting.php

    ==>更新1结束

2 个答案:

答案 0 :(得分:0)

一种可能的替代方法:

  1. 使用2列1行网格设置报告。将网格拉伸为纸张的长度。
  2. 设置一个定义了数字列的虚拟数据集,但始终不返回任何记录(例如,通过包含where 1=0条件)。
  3. 将虚拟数据集上的图形添加到网格的右侧单元格。将y轴标题的所有内容设置为不可见或透明。
  4. 在y轴标题中输入所需文本,并在y轴标题的字体对话框中根据需要设置文本方向,字体大小等。
  5. 调整主网格的单元格宽度,使右侧单元格与页面的右侧对齐,并且宽度足以显示所需的文本。
  6. 将报告的其余部分插入主网格的左侧单元格中。
  7. 这种方法的问题(除了它有点复杂)是y轴标题不能轻易设置为动态文本,据我所知。设置它的可能方法可能是在报表中的事件脚本中更改它,或者为其提供查找键(在图形y轴标题Externalize Text对话框中),并在运行报表时动态设置查找值。

答案 1 :(得分:0)

它完成了,现在,因为我知道它是如何工作的...这很容易;)

对于其他人都有同样的问题,以下是您在每个页面上获取相同内容的方法:

  1. 为整个页面创建一个双列网格,并将您的内容添加到一列中。
  2. 在数据资源管理器中创建一个报告变量maxPages,其默认值为0
  3. 在内容列中添加文本元素作为最后一个元素,具有以下属性

    • 隐藏元素,表达式:true
    • “在渲染时”脚本:

      vars["maxPages"] = reportContext.getPageVariable("pageNumber");
      
  4. 在第二列中添加具有以下属性的重复元素

    • 分页符 - 之前:始终(第一个元素除外)
    • 隐藏元素,表达式:

      vars["maxPages"] != 0 && vars["maxPages"] <= reportContext.getPageVariable("pageNumber")
      
      • 注意1 :将maxPages与0进行比较以显示第一页,该变量在首页上第一次设置时可用
      • 注意2 :与之前的分页符进行比较,因为之前的分页符,变量pageNumber包含的内容少于实际页码!
  5. 在我的情况下,重复项是带有垂直文本的动态图像,但这可能是一切,只需将每个匹配项包装在网格中