2015-07-07 1 views
0

Я получаю эту ошибку (заголовок) при попытке выполнить рендеринг с использованием Fo.Net при создании PDF-файла.Как минимум один из минимального, оптимального или максимального IPD должен быть указан в таблице

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

Я нашел еще один пост на эту тему (на Java, а не на C#, как я использую, но я предполагаю, что это та же ошибка с одной и той же причине): At least one of minimum, optimum, or maximum IPD must be specified on table - XSL-FO Apache FOP. Проблема в том, что я не могу найти нигде в файле xsl ниже, где размер не был установлен. Кто-нибудь знает, что может быть неправильно? Ниже приведен полный файл таблицы стилей XSL.

EDIT: после дальнейшего устранения неполадок мне удалось локализовать таблицу, в результате которой будет выбрано исключение. Я все еще не вижу, где я пропустил объявление размера.

    <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> 
+0

В элементе 'fo: table' отсутствует атрибут' width' (или 'inline-progression-dimension'). – lfurini

+2

[FO.NET] (http://fonet.codeplex.com/wikipage?title=FAQ&referringTitle=Home) не похож на программное обеспечение, которое активно поддерживается. Он основан на версии 0.20.4 FOP (которая является OLD). – mzjn

+0

Да, это не оптимально для этого, но это единственный, который мне удалось найти, который мог бы фактически выполнить эту операцию (только с открытым исходным кодом). Кажется, что C# вообще не подходит для создания PDF из xsl-fo. Попробовали ли кто-нибудь использовать CSS2 вместо этого? –

ответ

1

Я маркировка это как ответ ссылку на первый комментарий от @lfurini. Что касается последнего вопроса @lfurini, я искал неправильную таблицу, когда мне казалось, что я уже установил ширину таблицы. Поэтому подвести итог тому, чтобы кто-то еще интересовался этим; Если ширина установлена ​​в fo: table, достаточно установить ширину на одном из столбцов, а остальные будут корректироваться.