生成 PDF 期间块容器出现 XSL-FO 错误

Posted

技术标签:

【中文标题】生成 PDF 期间块容器出现 XSL-FO 错误【英文标题】:XSL-FO error with block-container during generation PDF 【发布时间】:2017-11-22 18:11:53 【问题描述】:

当我尝试使用文件 XSL-FO 生成 PDF 时遇到问题。 我的 XSL:

`

fo:block-container position="absolute" absolute-position="absolute" top="49mm" left="24mm"   >
<fo:block>
      <fo:table>
                <fo:table-column column-/>
                <fo:table-column column-/>`

                <fo:table-body>
                    <fo:table-row >
                        <fo:table-cell xsl:use-attribute-sets="box" number-rows-spanned="2">                            
                            <fo:block>

                <xsl:attribute name="font-weight">bold</xsl:attribute>
                <xsl:attribute name="text-align">center</xsl:attribute>
                <xsl:value-of select="NewDataSet/Interface/dossier_num"/> <xsl:value-of select="NewDataSet/Dossier/no_dossier"/>
              </fo:block>
                            <fo:block>
                                <fo:table>
                                    <fo:table-column />                                 
                                    <fo:table-body>
                    <fo:table-row>
                                            <fo:table-cell>
                                                <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/code_produit"/><xsl:text>: </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/code_produit"/>
                                                </fo:block>
                                            </fo:table-cell>
                    </fo:table-row>
                                        <fo:table-row>
                                            <fo:table-cell>
                                                <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/modele"/><xsl:text>: </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/modele"/>
                                                </fo:block>
                                            </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                                            <fo:table-cell>
                                                <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/provenance"/><xsl:text>: </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/mag_depot"/>
                                                </fo:block>                                             
                                            </fo:table-cell>
                                        </fo:table-row>
                                        <fo:table-row>
                                            <fo:table-cell>
                        <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/numero_serie"/><xsl:text>: </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/serie"/>
                                                </fo:block>
                                            </fo:table-cell>
                    </fo:table-row>
                    <fo:table-row>
                                            <fo:table-cell>
                        <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/garantie"/><xsl:text>: </xsl:text>                         
                          <xsl:choose>
                            <xsl:when test="/NewDataSet/Table/sous_garantie='true'"><xsl:value-of select="NewDataSet/Interface/oui"/></xsl:when>
                            <xsl:otherwise><xsl:value-of select="NewDataSet/Interface/non"/></xsl:otherwise>
                          </xsl:choose>                                             
                                                </fo:block>                                             
                                            </fo:table-cell>
                                        </fo:table-row>
                                        <fo:table-row>
                                            <fo:table-cell>
                        <fo:block font-size="8pt">
                                                    <xsl:attribute name="text-align">left</xsl:attribute>
                                                    <xsl:value-of select="NewDataSet/Interface/marque"/><xsl:text>: </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/marque"/>
                                                </fo:block>
                                            </fo:table-cell>                                            
                                        </fo:table-row>
                                        <fo:table-row>                                          
                                            <fo:table-cell>
                                                <fo:block font-weight="bold" text-align="right">
                                                    <xsl:value-of select="NewDataSet/Table/nom"/><xsl:text> </xsl:text>
                                                    <xsl:value-of select="NewDataSet/Table/prenom"/>
                                                </fo:block>                                             
                                            </fo:table-cell>
                                        </fo:table-row>
                                    </fo:table-body>
                                </fo:table>
                            </fo:block>
                        </fo:table-cell>        
            <fo:table-cell>
              <fo:table>
                <fo:table-column column-/>
                <fo:table-column column-/>

                <fo:table-body>
                  <fo:table-row >
                    <fo:table-cell display-align="center">
                      <fo:block  font-weight="bold" text-align="center">

                        <xsl:value-of select="NewDataSet/Dossier/no_dossier"/>

                      </fo:block>
                      <fo:block  font-weight="bold" text-align="center">
                        <xsl:value-of select="NewDataSet/Table/code_produit"></xsl:value-of>
                      </fo:block>
                    </fo:table-cell>
                    <fo:table-cell display-align="center">
                      <fo:block  font-weight="bold" text-align="center">
                        <xsl:value-of select="NewDataSet/Dossier/no_dossier"/>

                      </fo:block>
                      <fo:block  font-weight="bold" text-align="center">
                        <xsl:value-of select="NewDataSet/Table/code_produit"></xsl:value-of>
                      </fo:block>
                    </fo:table-cell>
                  </fo:table-row >
                  <fo:table-row >                                  
                  <fo:table-cell display-align="center">
                    <fo:block  font-weight="bold" text-align="center">
                      <xsl:value-of select="NewDataSet/Dossier/no_dossier"/>

                    </fo:block>
                    <fo:block  font-weight="bold" text-align="center">
                      <xsl:value-of select="NewDataSet/Table/code_produit"></xsl:value-of>
                    </fo:block>
                  </fo:table-cell>
                  <fo:table-cell display-align="center">
                    <fo:block  font-weight="bold" text-align="center">
                      <xsl:value-of select="NewDataSet/Dossier/no_dossier"/>
                    </fo:block>
                    <fo:block  font-weight="bold" text-align="center">
                      <xsl:value-of select="NewDataSet/Table/code_produit"></xsl:value-of>
                    </fo:block>
                  </fo:table-cell>
              </fo:table-row>
              </fo:table-body>
            </fo:table>
            </fo:table-cell>
                    </fo:table-row>
                </fo:table-body>
            </fo:table>  
`</fo:block>
</fo:block-container>

`

我有这个错误: 在“org.apache.fop.layout.AreaContainer”类型上的“org.apache.fop.layout.BlockArea”类型的不可能投射对象

当我尝试在使用相同 dll (apachefop.net) 的其他项目中生成时,我没有错误。 我怎样才能替换这个节点?我该如何解决这个问题?

谢谢

【问题讨论】:

【参考方案1】:

您将 fo:table 作为 fo:table-cell 的子级。将该表包装在一个块中。

【讨论】:

您好,我可以删除 fo:block-container 中的所有内容,我也有同样的问题。但是,当我删除块容器时,问题就消失了。

以上是关于生成 PDF 期间块容器出现 XSL-FO 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XSL-FO 中缩小块内的多个“外部图形”

使用 XSL-FO 在 .NET 中生成 PDF

XSL-FO - 将背景图像添加到多个 PDF 页面

PDF 中的 XSL-FO 超链接 - 打印关闭查看打开 - 天线之家

使用 XSL-FO 在下一个兄弟为空时隐藏块

使用iText-2.1.4.jar生成PDF表格,单元格内容越界怎么解决?