【问题标题】:Freemarker, PDF, Header/Footer and page-breaksFreemarker、PDF、页眉/页脚和分页符
【发布时间】:2013-05-16 06:16:38
【问题描述】:

Freemarker 的一个常见用途是生成 PDF。

不幸的是,我必须生成一个包含很多页面的 pdf,并且“他们”要求我放置一个包含一些信息的页眉和一个包含“第 2/60 页”等内容的页脚......

在网上搜索我发现了如何创建宏模板,但它只共享一些常用标签(如 css),但并没有告诉 freemarker 如何管理多页 PDF。

除此之外,有时我在 ftl 内部还有一个“分页 css 类”,因此我无法确定何时何地创建新页面。

我在 Java 上使用 Freemakrer 2.3

感谢您的帮助。

【问题讨论】:

  • 我只将 Freemarker 用于模板引擎,作为 PHP 的 Smarty。我会要求 POI 将其用于 PDF
  • 这不是我的选择。他们使用 freemarker,所以我必须这样做。
  • 你用 Freemarker 生成了什么?一个 HTML 文档,然后用另一个工具转换成 PDF,或者直接转换成 PDF 文档?
  • 我们从由 Map 填充的 HTML 开始,以匹配 freemarker 占位符: final String xhtml = createXHTML("foo.ftl.html", mapFullOfThings);比我们创建一个 byte[] "pdf" 最后 handler = new ResourceStreamRequestHandler(new ByteArrayResourceStream(pdf, "application/pdf"));
  • 您的描述中缺少一个步骤。 Freemarker 生成一个 HTML 文档(字符串 xhtml 变量)。然后将此 HTML 转换为 PDF(byte[] pdf 变量)。您使用什么工具进行这种转换?

标签: java header footer freemarker


【解决方案1】:

您可以使用 CSS 指定页眉和页脚(包括页码)。 如果用于将 XHTML 转换为 PDF 字节数组的工具支持分页媒体指令,这将起作用。

在 CSS 中:

@page { 
    @top-center {content: element(header)}      /* Header */
    @bottom-center {content: element(footer)}   /* Enpied */
}
#header {position: running(header);}
#footer {position: running(footer);}
#pagenumber:before {content: counter(page);}
#pagecount:before {content: counter(pages);}

在 HTML 中:

<div id="header">YOUR HEADER HERE</div>
<div id="footer">Page <span id="pagenumber" /> / <span id="pagecount" /></div>

【讨论】:

  • 有了这个解决方案,我在第一页有页眉,在最后一页有页脚,文字为:“第 54/54 页”。
  • XHTML 函数只有:模板模板 = freemarkerConfig.getTemplate(templateName + ".ftl.html", Constants.DEFAULT_ENCODING); StringWriter writer = new StringWriter(); template.process(mapFullOfThings, writer);返回 writer.toString();模板是一个freemarker类:​​package freemarker.template;
猜你喜欢
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
相关资源
最近更新 更多