【问题标题】:How to print table headers on all but the first page in freemarker如何在freemarker的第一页之外的所有页面上打印表格标题
【发布时间】:2013-08-16 22:09:28
【问题描述】:

我已经修改了我原来的问题,因为我是新来的,还不能回答我自己的问题……但这是我重新编写的问题,有更多的编码:

我将它用作 NetSuite 的一部分,这是我们公司使用的一种会计/订购/CRM 工具。我们可以使用他们的表单创建工具自定义我们自己的估计值,该工具结合了 freemarker、html 和 xml 来创建我们的估计值。

我设计了一个漂亮的估计,在这个估计中我可以从数据库中调用变量。基本上是运输/账单信息,估计项目,今天我能够添加页码(第 1 页,共 5 页或第 3 页,共 5 页)并使用页脚将它们放在底部。但是,我也想这样做,以便如果我的估算运行多页,我可以在顶部打印一个标题,这样您就会看到我解释的“数量、描述、价格”。

现在...我不确定宏的用途,这是我写页码并将它们放在页脚上的方式,稍后我将显示代码。

我想做类似的事情,这样我就可以说“如果我们不查看第 1 页,请打印此页眉,但如果我们正在查看第 1 页,则不要打印页眉”所以我想我可以做到那页 = page + 1 所以它一直在增加。这个想法适用于我的估算的其他部分(例如,列出的每个项目都在估算的单独行上,我实际上使用该方法打印了一个行号,但稍后在系统中通过它自己的例程运行LIST 函数)....

因此,任何帮助我的 HEADER 都将不胜感激。我希望我可以做一些简单的事情,例如“page = PAGENUMBER”,但由于某种原因我不能使用内置的 pagenumber 变量,它不能那样工作......这就是我所拥有的,简化了庄园:

<!--?xml version="1.0"?-->
<pdf>
 <head>
  <style type="text/css">
    STYLES HERE
  </style>

  <macrolist>
    <macro id="footer">
      <hr></hr>
      <table border="0" width="100%">
       <tr>
        <#setting time_zone="America/New_York">
        <td align="left">${.now}</td>
        <td align="right">Page <pagenumber/> of <totalpages/></td>
       </tr>
      </table>
      <hr></hr>
    </macro>
  </macrolist>

 </head>
 <body footer="footer" footer-height="12mm">

  REGULAR HTML HERE FOR OUR COMPANY

  <#if (record.item?size > 0)>

  <table class="border" width="100%" cellpadding="2">

  <#assign line = 0>
  <#list record.item as item>
  <#if item_index==0>

   <tr>
    <td width="5%" class="border4" valign="center"><b>Ln #</b></td>
    <td width="5%" class="border4" valign="center"><b>Qty</b></td>
    <td width="66%" class="border4" valign="center"><b>Description</b></td>
    <td width="12%" class="border4" valign="center" align="right"><b>Unit Price</b></td>
    <td width="12%" class="border5" valign="center" align="right"><b>Ext. Price</b></td>
   </tr>

  </table>

  <table width="100%" cellpadding="7">

  </#if>

   <tr>

    <#assign line = line + 1>
    <td width="5%" valign="top">${line}</td>
    <td width="5%" valign="top">${item.quantity}</td>
    <td width="71%" valign="top">${item.description?html}<br /><i>Manuf. Part #: ${item.item.text}</i></td>
    <td width="12%" valign="top" align="right">$${item.rate}</td>
    <td width="12%" valign="top" align="right">$${item.amount}</td>

   </#if>

   </tr>

  </#list>

  </table>

  </#if>

MORE HTML FOR OUR COMPANY HERE

 </body>
</pdf>

综上所述,关于如何将“LN #、QTY、DESCRIPTION、UNIT PRICE、EXT. PRICE”用作第 2 页及以后的页眉的任何想法? (第 1 页顶部有我们的信头和我们公司的其他一些 html 编码)

【问题讨论】:

    标签: freemarker


    【解决方案1】:

    我不知道 macromacrolist 是什么(这不是 FreeMarker),但我猜你不应该将 count 初始化为 0,除非它尚未定义。也就是说,你可以写成&lt;#assign count = (count!0) + 1&gt;,而不是那两个#assign-s。当然,FreeMarker Environment 的生命周期是什么样子很重要,因为如果你开始一个新的Environment(比如调用Template.process),count 的值将会丢失。

    【讨论】:

      【解决方案2】:

      我也在使用 NetSuite,但遇到了类似的问题。我认为您的问题与 Freemarker 无关,而是与 Big Faceless Organization (BFO) 有关。 Freemarker 准备 xml,BFO 将其转换为 PDF。 有关 BFO 的更多信息,请访问:http://bfo.com/products/report/。这就是你有页眉/页脚/宏概念的地方。

      阅读用户指南第 35 页的“表分页 - 页眉和页脚”部分,该部分描述了如何重新打印表格中的标准页眉或页脚行。

      该表必须是顶级的才能工作(即不在另一个表中。)

      【讨论】:

        【解决方案3】:

        我还不知道你的问题的答案,但我可以告诉你它可能在 Big Faceless PDF Library 用户指南中找到,而不是在 Freemarker...

        答案与特殊宏的应用有关:

        为了在页面上显示页眉和页脚,报告生成器引入了“宏”的概念 - 一个 XML 块,可以 在整个文档中重复多次。 共有三种不同类型的宏属性,可以在 BODY 或 PBR 元素上使用,为每个 页面,或通过在样式表中使用 #pagen 条目为特定页面。

        • header > 设置页面的header
        • footer > 设置页面的页脚
        • background-macro > 设置页面背景

        宏是在 MACROLIST 内文档的 HEAD 中定义的。每个宏都必须有一个 ID,这是稍后在文档中引用它的方式。这是一个在每个页面上设置标准页脚的示例:

        <pdf>
         <head>
         <macrolist>
          <macro id="myfooter">
           <p align="center">
           Page <pagenumber/> of <totalpages/>
           </p>
          </macro>
         </macrolist>
        </head>
        
        <body footer="myfooter" footer-height="20mm">
        Document contents here
        </body>
        </pdf>
        

        “footer”属性是宏的ID,“footer-height”属性是页脚所需的高度。如果文件 内容需要几页,页脚将被放置在每一页上,除非有一个 PBR 元素会改变页脚(或 通过设置 footer="none" 将其删除)。 “header”属性可以使用相同的方式在每个页面的顶部设置页眉。

        【讨论】:

          【解决方案4】:

          我知道这个问题的答案来晚了,但是当我试图弄清楚同样的事情时,我从 Russ 的答案和 BFO 文档中学到了答案。希望这将帮助其他正在寻找相同信息的人。使用样式属性和#pagen id,您可以为特定页面设置页眉或页脚。 nlfooter 是页脚宏的名称。我只将此页脚应用于第一页。这是我用来仅将页脚应用于第一页的代码。

          <style type="text/css">
            #page1 {
              footer: nlfooter;
              footer-height: 10%;
            }
          </style>
          

          Russ 的评论以及 BFO 文档中的引用帮助我意识到了这一点。这是添加了重点的引文。

          共有三种不同类型的宏属性,可以在 BODY 或 PBR 元素上为每个页面设置宏,或者通过在样式表中使用#pagen 条目为特定页面设置宏。

          【讨论】:

            【解决方案5】:

            正如 Yvan 所指出的,这不是一个 freemaker 问题,而是一个 问题。正如Shaun 所说,您可以使用#pagen 的CSS id 选择器来设置给定页面的页眉/页脚。问题在于,我看到的所有现有文档都表明,如果您使用 #pagen CSS 选择器,那么您还必须为每个其他页面定义 CSS。比如……

            /* If */
            #page1 {
              header: empty-header;
              header-height: 0px;
            }
            /* Then */
            #page2, #page3, #page4, ... #pagen {
              header: default-header;
              header-height: 10mm;
            }
            

            您基本上必须猜测最大页面大小是多少,并为每个页面添加一个 CSS 选择器。增加到 10 页或其他东西可能足够安全,因为老实说,谁会订购 11 页,对吧?

            好吧,如果这不适合您,或者您只是不喜欢这样的硬编码限制,那么我相信我有一个替代方案。如果在&lt;body&gt; 标签上定义了默认标题。然后为您需要的页面(即第 1 页)定义 #pagen CSS 选择器,但使用 !important CSS 属性,您将获得所需的结果。例如,这应该可以解决问题...

            <!--?xml version="1.0"?-->
            <pdf>
             <head>
              <style type="text/css">
                #page1 {
                  header: empty-header !important;
                  header-height: 0px !important;
                }
              </style>
            
              <macrolist>
                <macro id="empty-header">
                   <!-- Nothing to look at here -->
                </macro>
                <macro id="default-header">
                   <!-- Header HTML for all but first page -->
                </macro>
              </macrolist>
             </head>
             <body header="default-header" header-height="12mm">
               <!-- Page body HTML -->
             </body>
            </pdf>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-09-02
              • 1970-01-01
              • 1970-01-01
              • 2012-03-08
              • 1970-01-01
              • 2011-06-22
              • 2012-01-11
              • 1970-01-01
              相关资源
              最近更新 更多