使用 WeasyPrint 生成具有通用页眉/页脚和分页的 PDF

问题描述 投票:0回答:3

我正在 Django 中使用 WeasyPrint 生成 PDF。我可以从静态 html 文件生成 pdf,如下所示 -

from django.template import Context, Template
import weasyprint

with open('static_file.html', 'r') as myfile:
    html_str = myfile.read()

template = Template(html_message)
    context = Context({'some_key': 'some_value'})
    rendered_str = template.render(context)

weasyprint.HTML(string=rendered_str).write_pdf('generated.pdf')

但是我想生成一个 PDF,其中我可以在每个页面中包含通用的页眉/页脚并添加分页。

如果有人能告诉我如何包含自定义字体来生成 PDF,那将会非常有帮助。我已经在操作系统(Ubuntu 14.04)中安装了该字体,但它不起作用。

我在网上搜索了很多关于这些的信息。但找不到合适的解决方案。

python django fonts pagination weasyprint
3个回答
32
投票

由于 Weasyprint 支持 CSS 分页媒体模块级别 3,因此可以使用 CSS 完成简单页眉和页脚(例如分页,就像您提到的):

@page {
    @top-right{
        content: "Page " counter(page) " of " counter(pages);
    }
}

确保渲染时包含样式表:

HTML(string=rendered_html,
     base_url=settings.SITE_URL).write_pdf(stylesheets=[CSS(settings.STATIC_ROOT + '/css/pdf_render.css')])

但是,渲染更多复杂页眉/页脚可能会更加......复杂。有些人建议在标题中包含一个 div 元素,该元素仅用于打印(但我必须承认我只能使用此方法正确渲染简单的元素):

@page {
    @top-left {
        content: element(pageHeader);
    }
}
@media print {
    #divHeader{
        position: running(pageHeader);
    }
}

还有另一种使用固定位置的方法,如本要点所示:https://gist.github.com/pikhovkin/5642563


12
投票

WeasyPrint不支持当前运行的元素。尽管如此,我找到了一种使用 命名字符串 来实现相同结果的方法:

@page { @top-center { content: string(title); } } header { width: 0; height: 0; visibility: hidden; string-set: title content(); }

现在您可以将内容添加到不可见的 HTML 标头元素中。

<header>Content of the header goes here</header>
    

4
投票
我只需使用

position: fixed

 作为页眉和页脚即可使其工作。

首先,由于固定位置的元素不占用页面空间,因此您必须在页面上给予适当的边距来考虑这一点,例如:

@page { margin: 5cm 0 3cm 0; size: A4; }
然后简单地将页眉和页脚相对于该边距定位:

header, footer { position: fixed; left: 0; right: 0; } header { /* subtract @page margin */ top: -5cm; height: 5cm } footer { /* subtract @page margin */ bottom: -3cm; height: 3cm; }
有了这个,您可以在 

<header>

<footer>
 元素中放置任意 HTML,它们将在每个页面上重复。

页面计数器似乎在那里不起作用,因此您需要根据其他答案中所述的

@page

规则来实现它们。

© www.soinside.com 2019 - 2024. All rights reserved.