12

我正在使用 Wea​​syPrint 在 Django 中生成 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)中安装了字体,但它不工作。

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

4

3 回答 3

24

由于 Weasyprint 支持 CSS Paged Media Module Level 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

于 2016-12-22T14:48:04.910 回答
8

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>
于 2018-08-03T14:36:43.820 回答
0

我可以简单地通过使用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;
}

有了这个,您可以将任意 HTML 放入<header><footer>元素中,它们将在每个页面上重复。

页面计数器似乎在那里不起作用,因此您需要@page按照其他答案中的描述实现基于它们的规则。

于 2022-01-16T19:43:17.343 回答