You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django项目中用Python pdfkit将HTML生成多页PDF

实现每个内容块单独分页的两种方法

pdfkit依赖wkhtmltopdf渲染PDF,可通过CSS分页属性控制每页内容,以下是两种可行方案:

方案1:在Django模板中添加分页样式

直接修改pdfs/routines_handout.html模板,给每个内容块容器添加分页逻辑,避免最后一个块后出现空白页:

<div class="content-block">
    <h1>{{ title }}</h1>
    {% for item in contents %}
        <p>{{ item }}</p>
    {% endfor %}
</div>

<!-- 仅在非最后一个块后添加分页符 -->
{% if not forloop.last %}
    <div style="page-break-after: always;"></div>
{% endif %}

注:forloop.last是Django模板内置变量,仅在循环最后一次迭代时为True,刚好避免多余的空白页。

方案2:在Python代码中拼接分页符

若不想修改模板,可在拼接HTML字符串时,给每个渲染后的内容块(除最后一个)添加分页符:

import pdfkit
from django.template.loader import render_to_string

my_contents = [
    {'title':'Example 1', 'contents': ['Lorem ipsum dorer', 'Lorem ipsum']},
    {'title':'Example 2', 'contents': ['Lorem ipsum dorer', 'Lorem ipsum']},
    {'title':'Example 3', 'contents': ['Lorem ipsum dorer', 'Lorem ipsum']},
    {'title':'Example 4', 'contents': ['Lorem ipsum dorer', 'Lorem ipsum']},
    {'title':'Example 5', 'contents': ['Lorem ipsum dorer', 'Lorem ipsum']}
]

final_html = ''
total_items = len(my_contents)
for index, content in enumerate(my_contents):
    data = {
        'title': content['title'],
        'contents': content['contents'],
    }
    final_html += render_to_string('pdfs/routines_handout.html', data)
    # 非最后一项时插入分页符
    if index != total_items - 1:
        final_html += '<div style="page-break-after: always;"></div>'

my_pdf = pdfkit.from_string(final_html, 'out.pdf')

原理说明

wkhtmltopdf支持CSS分页属性:

  • page-break-after: always:强制在当前元素后插入分页符
  • page-break-before: always:强制在当前元素前插入分页符

若希望每个内容块从新页开始,也可改用page-break-before: always(注意第一个块无需添加)。

内容的提问来源于stack exchange,提问作者Germano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:21