必须在 table 上指定最小、最佳或最大 IPD 中的至少一项

At least one of minimum, optimum, or maximum IPD must be specified on table

创建 PDF 时尝试使用 Fo.Net 执行渲染时出现此错误(标题)。

    [MethodImpl(MethodImplOptions.Synchronized)]
    public static void MakePdf(XmlDocument xslFoDocument, Stream outputStream)
    {
        FonetDriver driver = PdfPrinterDriver.InitFonetDriver();
        driver.Render(xslFoDocument, outputStream);
    }

我在这个主题上发现了另一个 post(针对 Java 而不是我正在使用的 C#,但我认为它是同一个错误,原因相同):At least one of minimum, optimum, or maximum IPD must be specified on table - XSL-FO Apache FOP.问题是我在下面的 xsl 文件中找不到任何未设置大小的地方。任何人都知道什么可能是错的?下面是完整的 XSL 样式表文件

编辑:经过进一步的故障排除后,我设法定位了导致抛出异常的 table。不过,我仍然看不出我错过了声明尺寸的地方。

                    <fo:table-column column-width="7cm"/>
                    <xsl:for-each select="$units">
                        <xsl:variable name="bgcolor">
                            <xsl:choose>
                                <xsl:when test="position() mod 2 = 0">white</xsl:when>
                                <xsl:otherwise>#F4F2F0</xsl:otherwise>
                            </xsl:choose>
                        </xsl:variable>
                        <fo:table-column background-color="{$bgcolor}"/>
                    </xsl:for-each>
                    <fo:table-body>

                        <fo:table-row>
                            <fo:table-cell>
                                <fo:block>

                                </fo:block>
                            </fo:table-cell>
                            <xsl:for-each select="$units">
                                <fo:table-cell text-align="center">
                                    <xsl:choose>
                                        <xsl:when test="not(contains($hiddenGroups, 'image'))">
                                            <fo:block margin-top="3mm" margin-left="4mm" margin-right="4mm" margin-bottom="-0.8mm">               

                                                <fo:external-graphic content-width="500mm" width="100%" src="{$apiurl}ImageFiles/{Attributes/Attribute[@id='Image']/FileInfo/@id}/Data?apikey={$apikey}"/>                            
                                            </fo:block>
                                            <fo:block background-color="white" font-weight="600" padding-top="2mm" padding-bottom="2mm" margin-left="4mm" margin-right="4mm" margin-bottom="3mm">
                                                <xsl:value-of select="@name"/>
                                            </fo:block>
                                        </xsl:when>
                                        <xsl:otherwise>                                            
                                            <fo:block background-color="white" font-weight="600" padding-top="2mm" padding-bottom="2mm" margin-top="3mm" margin-left="4mm" margin-right="4mm" margin-bottom="3mm">
                                                <xsl:value-of select="@name"/>
                                            </fo:block>    
                                        </xsl:otherwise>
                                    </xsl:choose>
                                </fo:table-cell>
                            </xsl:for-each>
                        </fo:table-row>

                        <xsl:for-each select="$general_attributes">
                            <xsl:variable name="attribute_id" select="@id"/>
                            <xsl:variable name="attribute_type" select="@attributeDefinitionType"/>
                            <xsl:if test="not(contains(@id, 'HIDE_COMP'))">
                                <fo:table-row keep-with-previous="always" border-bottom-style="solid" border-bottom-width="thin" border-bottom-color="#D0D0D0">
                                    <fo:table-cell display-align="center" padding-top="2mm" padding-bottom="2mm">
                                        <fo:block margin-left="2mm" margin-right="2mm">
                                            <xsl:value-of select="@name"/>:
                                        </fo:block>
                                    </fo:table-cell>
                                    <xsl:for-each select="$units">
                                        <fo:table-cell padding-top="2mm" padding-bottom="2mm" padding-left="4mm" padding-right="4mm" display-align="center" border-left-style="solid" border-right-style="solid" border-width="0.1mm" border-color="#D0D0D0">
                                            <xsl:call-template name="show-attribute">
                                                <xsl:with-param name="type" select="$attribute_type"/>
                                                <xsl:with-param name="attribute" select="Attributes/Attribute[@id=$attribute_id]"/>
                                                <xsl:with-param name="count" select="count($units)"/>
                                            </xsl:call-template>
                                        </fo:table-cell>
                                    </xsl:for-each>
                                </fo:table-row>
                            </xsl:if>
                        </xsl:for-each>

                       <xsl:if test="not(contains($hiddenGroups, 'Enkät'))">
                        <xsl:for-each select="$specific_attributes">
                            <xsl:variable name="attribute_id" select="@id"/>
                            <xsl:variable name="attribute_type" select="@attributeDefinitionType"/>

                            <xsl:if test="not(@group = preceding-sibling::*/@group)">
                                <fo:table-row>
                                    <fo:table-cell padding-top="10mm" padding-bottom="5mm" number-columns-spanned="{1 + count($units)}">
                                         <fo:block font-size="13" font-weight="bold" color="white" background-color="#0191ac" padding-top="2mm" padding-bottom="1.5mm" margin-bottom="2mm"> 
                                            <fo:inline padding-left="4mm"><xsl:value-of select="@group"/></fo:inline>                                               
                                        </fo:block>                                           
                                    </fo:table-cell>
                                </fo:table-row>
                            </xsl:if>
                            <fo:table-row keep-with-previous="always" border-bottom-style="solid" border-bottom-width="thin" border-bottom-color="#D0D0D0">
                                <fo:table-cell display-align="center" padding-top="2mm" padding-bottom="2mm">
                                    <fo:block margin-left="2mm" margin-right="2mm">
                                        <xsl:value-of select="@name"/>
                                    </fo:block>
                                </fo:table-cell>
                                <xsl:for-each select="$units">
                                    <fo:table-cell padding-top="2mm" padding-bottom="2mm" padding-left="4mm" padding-right="4mm" display-align="center" border-left-style="solid" border-right-style="solid" border-width="0.1mm" border-color="#D0D0D0">
                                        <xsl:call-template name="show-attribute">
                                            <xsl:with-param name="type" select="$attribute_type"/>
                                            <xsl:with-param name="attribute" select="Attributes/Attribute[@id=$attribute_id]"/>
                                            <xsl:with-param name="count" select="count($units)"/>
                                        </xsl:call-template>
                                    </fo:table-cell>
                                </xsl:for-each>
                            </fo:table-row>
                        </xsl:for-each>
                       </xsl:if>

                    </fo:table-body>
                </fo:table>

我将其标记为已回答并参考@lfurini 的第一条评论。至于最后一个问题@lfurini,当我认为我已经设置了 table 宽度时,我看到了错误的 table。因此,总结一下其他人也对此感到疑惑;如果在 fo:table 中设置了宽度,只需在其中一列上设置宽度,其余的将自动调整。