如何在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
相关产品推荐
相关产品推荐

