1

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

我将它用作 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编码)

4

5 回答 5

2

正如Yvan所指出的,这不是一个 freemaker 问题,而是一个问题。正如Shaun所说,您可以使用#page n的CSS id 选择器为给定页面设置页眉/页脚。问题在于,我看到的所有现有文档都表明,如果您使用 #page n 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>标签上的默认标题。然后为您需要的页面(即第 1 页)定义 #page n!important CSS 选择器,但使用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>
于 2021-08-03T19:05:38.723 回答
1

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

于 2013-08-14T21:35:59.147 回答
0

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

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

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

于 2013-08-20T06:38:01.513 回答
0

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

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

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

  • 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”属性可以使用相同的方式在每个页面的顶部设置标题。

于 2016-12-10T03:48:04.770 回答
0

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

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

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

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

于 2019-12-12T14:54:39.467 回答