如何避免在页面之间拆分单元格的内容?

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) &gt; 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>

是什么导致了这种行为,我该如何解决?

【问题讨论】:

在 CSS tr page-break-inside : avoid 中可能会有所帮助,我认为对于 XSL-FO,您可以为表格/表格行设置类似的属性或属性。 测试是否例如&lt;fo:table-row page-break-inside="avoid"&gt; 应用于您的表格行元素解决了这个问题: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-rowfo:table-cell 中的一个或两个上尝试keep-together.within-page="always"(参见https://www.w3.org/TR/xsl11/#keep-together)。我对早期的 FOP 版本有一个模糊的记忆,在 FOP 支持很多关于保持的其他内容之前实现了它。

您也可以尝试为orphans 和/或widows 设置一个较大的值,看看这是否会阻止您的段落中断。

【讨论】:

以上是关于如何避免在页面之间拆分单元格的内容?的主要内容,如果未能解决你的问题,请参考以下文章

如何将EXCEL表格里一个单元格的数据拆分为两列

分列:将excel单元格的内容拆分为两列

关于Excle表格如何拆分?

Pandas读取excel合并单元格的正确姿势(openpyxl合并单元格拆分并填充内容)

iview Table表格组件无法拆分单元格的解决思路

如何将EXCEL表格中的同一列有相同的内容 合并成一个单元格?