如何在freemarker中的第一页上打印表头

时间:2013-08-14 19:24:14

标签: freemarker

我修改了我原来的问题,因为我是新手,现在还不能回复我自己的问题......但是这里重新编写了我的问题,编码更多:

我将此作为NetSuite的一部分使用,NetSuite是我们公司使用的会计/订购/ CRM工具。我们可以使用表单创建工具自定义我们自己的估算值,该工具采用freemarker,html和xml的组合来创建我们的估算值。

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

现在......我不确定宏的用途是什么,这就是我编写页码并将它们放在页脚上的方法,我将稍微展示一下代码。

我想做类似的事情以便我可以说“如果我们不看第1页,打印THIS标题,但如果我们正在查看第1页,请不要打印标题”所以我认为我可以做那个页面=页面+ 1所以它不断增加。这个想法在我的估计的其他部分工作(例如,列出的每个项目都在估算的单独行上,我实际上使用该方法打印行号,但是在稍后的系统中通过列表功能)....

所以任何有助于让我的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页和第2页标题的任何想法? (第1页我们的信头在顶部,其他一些html编码为我们公司)

5 个答案:

答案 0 :(得分:1)

我不知道macromacrolist是什么(不是FreeMarker),但我猜你不应该count初始化为0,除非它还没有未定义。也就是说,您可以编写#assign而不是那两个<#assign count = (count!0) + 1> - s。当然,FreeMarker Environment的生命周期看起来很重要,因为如果你开始一个新的countEnvironment的价值将会丢失(如致电Template.process )。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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

  

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

     
      
  • 标题&gt;设置页面标题
  •   
  • 页脚&gt;设置页面的页脚
  •   
  • background-macro&gt;设置页面的背景
  •   
     

宏在MACROLIST内的文档的HEAD中定义。每个宏都必须有一个ID,这是后面文档中引用的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”属性的使用方法与在每个页面顶部设置标题的方式相同。

答案 3 :(得分:0)

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

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

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

  

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

答案 4 :(得分:0)

正如 Yvan 所指出的,这不是一个自由制作者的问题,而是一个 的问题。正如 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 页,对吗?

好吧,如果这不适合您,或者您只是不喜欢这样的硬编码限制,那么我相信我有替代方案。如果在 <body> 标签上定义了默认标头。然后为您需要的页面(或页面)定义 #pagen CSS 选择器(即您的情况下的第 1 页),但使用 !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>