如何避免在页面之间拆分单元格的内容?
Posted
技术标签:
【中文标题】如何避免在页面之间拆分单元格的内容?【英文标题】:How can I avoid having the content of a cell split between pages? 【发布时间】:2021-07-30 09:44:33 【问题描述】:我有一个 XSL-FO 文件,然后使用 FOP 0.20.5 将其转换为 PDF 文件。我有一个表,其中包含每个页面、页眉和页脚上显示的标题列。
我的输出问题如下:属于第 5 列单元格的文本在页面之间拆分(在下一页中,只有部分文本不适合上一页,其他行中的单元格是空的)。我怎样才能防止这种行为?我希望将整个内容放在下一页上,而不仅仅是该文本的一部分(当然,当这种情况发生时,最后一行不应该存在于上一页,而是整行移到下一页)。
来自 xsl 文件的部分代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="fo"
version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="java" xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:output method="xml"
version="1.0"
omit-xml-declaration="no"
indent="yes"/>
Layout-master-set 部分:
<fo:layout-master-set>
<fo:simple-page-master master-name="A4" page- page- margin-top="0.5cm" margin-bottom="0.5cm" margin-left="2.0cm" margin-right="2.0cm">
<fo:region-before region-name="xsl-region-before" extent="2cm"/>
<fo:region-body region-name="xsl-region-body" margin-top="2cm" margin-bottom="4.0cm"/>
<fo:region-after region-name="xsl-region-after" extent="2.5cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
表格部分:
<fo:flow flow-name="xsl-region-body">
<fo:table table-layout="fixed">
<fo:table-column column-/>
...
<!-- more table-column def. -->
...
...
<xsl:if test="string-length($PAR_MODIFY) > 0">
<fo:table-column column-/>
</xsl:if>
<fo:table-header>
<fo:table-row>
<xsl:attribute name="background-color">#60c3d9</xsl:attribute>
<fo:table-cell display-align="center" border-top="0.05em solid #60c3d9" border-right="0.05em solid white">
<fo:block text-align="center" color="white" font-weight="bold">Date blabla</fo:block>
</fo:table-cell>
...
...
<!-- more cells -->
...
...
...
</fo:table-row>
</fo:table-header>
<fo:table-body>
<xsl:apply-templates select="POS"/>
</fo:table-body>
</fo:table>
</fo:flow>
行部分:
<xsl:template match="POS">
<xsl:apply-templates select="SP"></xsl:apply-templates>
</xsl:template>
<xsl:template match="SP">
<fo:table-row >
<fo:table-cell display-align="center" border="0.05em solid grey" >
<fo:block text-align="center">
<xsl:value-of select="'Bla bla bla'"/>
</fo:block>
</fo:table-cell>
<fo:table-cell display-align="center" border="0.05em solid grey">
<fo:block text-align="center">
<xsl:value-of select="'Bla bla bla 2222..'"/>
</fo:block>
</fo:table-cell>
...
...
...
<!-- more table-cells -->
...
...
...
...
</fo:table-row>
</xsl:template>
是什么导致了这种行为,我该如何解决?
【问题讨论】:
在 CSStr page-break-inside : avoid
中可能会有所帮助,我认为对于 XSL-FO,您可以为表格/表格行设置类似的属性或属性。
测试是否例如<fo:table-row page-break-inside="avoid">
应用于您的表格行元素解决了这个问题:w3.org/TR/xsl11/#d0e26492
对不起,我正在使用 fop-0.20.5.jar 将 xsl 转换为 pdf。不幸的是,将其添加到表格行并没有帮助@MartinHonnen。
O.something 似乎太旧了,我认为 2.5 是当前版本
【参考方案1】:
正如@MartinHonnen 所说,FOP 0.20.5 已经很老了。您可以在fo:table-row
和fo:table-cell
中的一个或两个上尝试keep-together.within-page="always"
(参见https://www.w3.org/TR/xsl11/#keep-together)。我对早期的 FOP 版本有一个模糊的记忆,在 FOP 支持很多关于保持的其他内容之前实现了它。
您也可以尝试为orphans
和/或widows
设置一个较大的值,看看这是否会阻止您的段落中断。
【讨论】:
以上是关于如何避免在页面之间拆分单元格的内容?的主要内容,如果未能解决你的问题,请参考以下文章