如何使用Freemarker和Apache FOP将项目列表呈现为4个块?

时间:2014-05-23 23:57:20

标签: freemarker apache-fop

我有一个对象列表,我想使用Freemarker迭代生成一个FOP模板,在每个页面上显示其中的四个项目。

每个项目占据页面的四分之一。

在HTML中,我可能会将div放在一起,以便它们在适合页面时一起流动,但我不知道如何使用FOP。

我尝试使用内联元素来实现这一目标,但这并不像我期望的那样有效。

      <fo:page-sequence master-reference="apage">
    <fo:flow flow-name="xsl-region-body">
        <fo:block>
          <#list entries as entry>
            <fo:inline background-color="blue" border="2px solid black">
                <fo:block height="100mm" width="150mm"  background-color="red" border="2px solid green">
                    <#include "singleCardTemplate.ftl">
                </fo:block>
            </fo:inline>
          </#list>
      </fo:block>
    </fo:flow>
  </fo:page-sequence>

包含的singleCardTemplate.ftl负责呈现单个项目,这似乎是有效的,只有它呈现全宽,而不是150mm,正如我所希望的那样。我喜欢彼此相邻的2x150mm宽的积木,另外还有2个。每页四个。

我很高兴Freemarker / FOP组合工作正常,我确实得到了一个PDF,其中包含正确的内容和一些边框/颜色,如上所述。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案,转移到表格布局。 我更喜欢使用像HTML内联块元素一样流动的布局,但这似乎有效...

    <fo:flow flow-name="xsl-region-body">
        <fo:block>
            <fo:table table-layout="fixed" height="100%">
                 <fo:table-column  column-width="proportional-column-width(2)"/>
                 <fo:table-column  column-width="proportional-column-width(2)"/>
                 <fo:table-body font-size="10pt">
                    <fo:table-row height="100mm">
                        <#list entries as entry>
                            <fo:table-cell margin="5mm">
                                <#include "singleCardTemplate.ftl">
                            </fo:table-cell>
                            <#assign mod = entry_index % 2 />
                            <#if entry_has_next>
                                <#if mod == 0>
                                    </fo:table-row>
                                    <fo:table-row  height="100mm">
                                </#if>
                            </#if>
                        </#list>
                    </fo:table-row>
                 </fo:table-body>
            </fo:table>
        </fo:block>
    </fo:flow>