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

时间:2016-10-09 09:20:24

标签: python django fonts pagination weasyprint

我正在使用WeasyPrint在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),但它无法正常工作。

我在网上搜索了很多这些内容。但找不到合适的解决方案。

2 个答案:

答案 0 :(得分:12)

由于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

答案 1 :(得分:2)

当前正在运行的元素are not supported by WeasyPrint。不过,我找到了一种使用named strings来达到相同结果的方法:

 @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>