当前位置: 首页 > 知识库问答 >
问题:

Apache FOP |多页表行高问题

楚皓君
2023-03-14

我正在使用Apache FOP XSL文件格式生成PDF。

我的要求是

  • PDF格式的表格数据
  • 表大小很大,因此同一表扩展到多页(宽度方向,第一页中的列很少,其他列在下一页上)
  • 第1页有3列(C1、C2、C3)
  • 第2页有5列(C4、C5、C6、C7、C8)
  • 少数单元格可能包含多行数据

问题描述:

  • 当 Page-2 具有第 4 行、第 4 列的多行数据时,其行高会根据内容增加
  • 但是在第 1 页中,第 4 行的行高为单行。

当任何单元格数据是任何页的多行时,我希望在同一表的所有页上具有相同的行高。

如果需要,下面是XSL文件:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format"
    version="1.0">

  <!-few params declaration->

    <xsl:template match="/rs">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="data-template-1" page-height="11.0in" page-width="17.0in"
                                       margin-top="0.5in" margin-bottom="1.0in" margin-left="0.5in"
                                       margin-right="0.5in">
                    <fo:region-body margin-top="1.5in" margin-bottom="0.8in"/>
                    <fo:region-before extent="0.7in"/>
                    <fo:region-after/>
                </fo:simple-page-master>
                <fo:simple-page-master master-name="data-template-2" page-height="11.0in" page-width="17.0in"
                                       margin-top="0.5in" margin-bottom="1.0in" margin-left="0.5in"
                                       margin-right="0.5in">
                    <fo:region-body margin-top="1.5in" margin-bottom="0.8in"/>
                    <fo:region-before extent="0.7in"/>
                    <fo:region-after/>
                </fo:simple-page-master>
            </fo:layout-master-set>

            <xsl:for-each select="rb">
                <xsl:variable name="current-initial-page-number" select="$param.initialPageNumber + (position() * $pagesPerTable)" />
                <fo:page-sequence master-reference="data-template-1" initial-page-number="{$current-initial-page-number}"
                                  font-size="{$cdrFontSize}" font-family="{$cdrFontFamily}" line-height="10.2pt">
                    
                    
                    <fo:flow flow-name="xsl-region-body">
                        <fo:table table-layout="fixed" width="100%" space-after.optimum="{$cdrInfoTableSpaceAfter}" border-width="0.4mm" border-style="solid">
                            <fo:table-column column-width="23.1mm"/>
                            <fo:table-column column-width="23.1mm"/>
                            <fo:table-column column-width="18.9mm"/>
                            
                            <fo:table-header text-align="center" display-align="center">
                                <fo:table-row font-weight="bold" background-color="rgb(230,230,230)">
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C1'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C2'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C3"/>
                                    </xsl:call-template>
                                    
                                </fo:table-row>
                            </fo:table-header>

                            <fo:table-body>
                                <xsl:for-each select="r">
                                    <fo:table-row text-align="left" display-align="before">
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C1']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C12']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C3']"/>
                                        </xsl:call-template>
                                        
                                    </fo:table-row>
                                </xsl:for-each>
                            </fo:table-body>
                        </fo:table>
                    </fo:flow>
                </fo:page-sequence>
                <fo:page-sequence master-reference="data-template-2"
                                  font-size="{$cdrFontSize}" font-family="{$cdrFontFamily}" line-height="10.2pt">
                    
                    <fo:flow flow-name="xsl-region-body">
                        <fo:table table-layout="fixed" width="100%" space-after.optimum="{$cdrInfoTableSpaceAfter}" border-width="0.4mm" border-style="solid">
                            <fo:table-column column-width="88.2mm"/>
                            <fo:table-column column-width="88.2mm"/>
                            <fo:table-column column-width="48.3mm"/>
                            <fo:table-column column-width="23.1mm"/>
                            <fo:table-column column-width="54.6mm"/>
                            <fo:table-header text-align="center" display-align="center">
                                <fo:table-row font-weight="bold" background-color="rgb(230,230,230)">
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C4'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C5'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C6'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C7'"/>
                                    </xsl:call-template>
                                    <xsl:call-template name="cdr_table_cell">
                                        <xsl:with-param name="cellValue" select="'C8'"/>
                                    </xsl:call-template>
                                </fo:table-row>R
                            </fo:table-header>

                            <fo:table-body>
                                <xsl:for-each select="r">
                                    <fo:table-row text-align="left" display-align="before">
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C4']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C5']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C6']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C7']"/>
                                        </xsl:call-template>
                                        <xsl:call-template name="cdr_table_cell">
                                            <xsl:with-param name="cellValue" select="c[@n='C8']"/>
                                        </xsl:call-template>
                                    </fo:table-row>
                                </xsl:for-each>
                            </fo:table-body>
                        </fo:table>
                    </fo:flow>
                </fo:page-sequence>
            </xsl:for-each>
        </fo:root>
    </xsl:template>

    <xsl:template name="cdr_table_cell">
        <xsl:param name="cellValue"/>
        <fo:table-cell border-width="0.4mm" border-style="solid">
            <fo:block-container overflow="hidden">
                <fo:block margin-left="0.5mm" margin-top="0.3mm">
                    <xsl:call-template name="zero_width_space_1">
                        <xsl:with-param name="data" select="$cellValue"/>
                    </xsl:call-template>
                </fo:block>
            </fo:block-container>
        </fo:table-cell>
    </xsl:template>

    <!-- The following templates are used to add empty space character to data, so that FOP can break (wrap) the word -->
    <xsl:template name="zero_width_space_1">
        <xsl:param name="data"/>
        <xsl:param name="counter" select="0"/>
        <xsl:choose>
            <xsl:when test="$counter &lt;= string-length($data)">
                <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
                <xsl:call-template name="zero_width_space_2">
                    <xsl:with-param name="data" select="$data"/>
                    <xsl:with-param name="counter" select="$counter+1"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="'&#160;'"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="zero_width_space_2">
        <xsl:param name="data"/>
        <xsl:param name="counter"/>
        <xsl:value-of select='concat(substring($data,$counter,1),"&#8203;")'/>
        <xsl:call-template name="zero_width_space_1">
            <xsl:with-param name="data" select="$data"/>
            <xsl:with-param name="counter" select="$counter+1"/>
        </xsl:call-template>
    </xsl:template>
</xsl:stylesheet>

我不想要的

  • 固定行高,因为即使所有数据都累积在一行中,也会浪费页面空间。

共有1个答案

穆铭晨
2023-03-14

设置完整表格的格式两次:每页一次。

对于表的第一个副本,使第3列之后的所有内容都为白色或透明。

对于表格的第二个副本,使第 1 列到第 3 列中的所有内容均为白色或透明,并在表格上添加负边距(并在表格单元格中将其设置回 0),以便第 1 列到第 3 列不在页面左侧。

请注意,如果您使用的是AH格式,您可以使用扩展页面母版扩展(参见https://www.antenna.co.jp/AHF/help/v70e/ahf-spread.html)并创建一个横跨两个页面的区域。

 类似资料:
  • nuxt3构建的项目,开多个网页之后,一开始没事,然后停留一段时间,发现占用CPU过高,然后使用性能录制了占用过高一段时间的记录,如下两张图,发现定时器在很短的时间零点几毫秒的间隔就执行了,但是程序中并未设置这么短的时间

  • 问题内容: 最初,我的数据库中有两个表[Property]和[Employee]。 每个雇员可以有一个“家庭财产”,因此雇员表中有一个“财产”的HomePropertyID FK字段。 后来,我需要对这种情况进行建模,即尽管员工只有一个“房屋财产”,但确实在多个财产上工作或涵盖了多个财产。 因此,我创建了一个[Employee2Property]表,该表具有EmployeeID和PropertyI

  • 问题内容: 我有一个,需要在其中添加3行,例如: 如何在中设置文字?我尝试过,但是没有用。 问题答案: 1:JTextField不支持多行。您想要的是一个JTextArea 2:换行符并非在所有系统上都相同,如果您正在运行Windows ,则可能必须使用换行符。从Java 7开始,已经解决了这个问题。 (请参阅Oracle文档)

  • 场景- > TableView高度是使用纵横比相对于superview的高度动态设置的。 TableViewCell的高度是根据表格视图的高度计算的: 问题 - 最初在委托方法中没有正确计算表格视图高度。但在滚动单元格后正确计算。 尝试的解决方案: 在视图中重新加载。 调用 在单元格中进行. 有什么方法可以正确计算出这个表格的高度吗?

  • 我试图使用Apache Fop和Java生成PDF,但生成的Pdf总是一个空白页。它都嵌套在一个网络应用程序中,割断器是玻璃鱼。 有人有什么建议吗? 以下是我的xsl: 示例XML文件如下所示: 编辑:应该生成pdf的Java代码。。。 第二次编辑: 我发现我的outputStream有问题。我想显示另存为对话框,以便从web应用程序下载生成的文件。我不明白,我的输出有什么问题。。。

  • 我正在尝试创建一个表,其中的节标题可以是长字符串。我认为我的设置是正确的(动态行数,换行设置),但字符串只是在末尾被截断。请注意,在其他地方,节标题的高度为80,这足以显示大约3行文本。