如何使用 Freemarker 和 Apache FOP 将项目列表呈现为 4 个块?
Posted
技术标签:
【中文标题】如何使用 Freemarker 和 Apache FOP 将项目列表呈现为 4 个块?【英文标题】:How can I render a list of items as 4 blocks using Freemarker and Apache FOP? 【发布时间】:2014-07-13 10:38:48 【问题描述】:我有一个对象列表,我想使用 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 background-color="red" border="2px solid green">
<#include "singleCardTemplate.ftl">
</fo:block>
</fo:inline>
</#list>
</fo:block>
</fo:flow>
</fo:page-sequence>
包含的 singleCardTemplate.ftl 负责渲染单个项目,这似乎可以正常工作,只是它以全宽渲染,而不是我希望的 150 毫米。我想要 2x150mm 宽的块彼此相邻,下面还有 2 个。所以每页四个。
我很高兴 Freemarker/FOP 组合工作正常,我确实得到了一个 PDF,其中包含正确的内容和上面的一些边框/颜色。
我做错了什么?
【问题讨论】:
【参考方案1】:我找到了解决方案,转到表格布局。 我更喜欢使用像 HTML inline-block 元素一样流动的布局,但这似乎工作......
<fo:flow flow-name="xsl-region-body">
<fo:block>
<fo:table table-layout="fixed" >
<fo:table-column column-/>
<fo:table-column column-/>
<fo:table-body font-size="10pt">
<fo:table-row >
<#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 >
</#if>
</#if>
</#list>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
</fo:flow>
【讨论】:
以上是关于如何使用 Freemarker 和 Apache FOP 将项目列表呈现为 4 个块?的主要内容,如果未能解决你的问题,请参考以下文章
漏洞分析 | Apache Struts2 Freemarker标签远程执行漏洞分析和复现(S2-053)