我正在尝试使用 ReportLab 和 Python 2.7 排版一个大型文档。
它有许多部分(在 1,000 页的文档中大约有 6 个部分),我希望每个部分都从奇数页/右侧页开始。我不知道前一页是奇数还是偶数,因此需要能够在特定段落样式之前选择性地抛出一个额外的空白页(就像您有时会在手册中看到某些页面“故意留空”)。谁能建议如何做到这一点,因为我能找到的唯一有条件的分页符是基于页面上的文本数量而不是页码。
我还需要确保 PDF 中包含空白页,以便进行双面打印。
我正在尝试使用 ReportLab 和 Python 2.7 排版一个大型文档。
它有许多部分(在 1,000 页的文档中大约有 6 个部分),我希望每个部分都从奇数页/右侧页开始。我不知道前一页是奇数还是偶数,因此需要能够在特定段落样式之前选择性地抛出一个额外的空白页(就像您有时会在手册中看到某些页面“故意留空”)。谁能建议如何做到这一点,因为我能找到的唯一有条件的分页符是基于页面上的文本数量而不是页码。
我还需要确保 PDF 中包含空白页,以便进行双面打印。
如果您可以跟踪页码,则只需在适当的时间添加 PageBreak 或 canvas.showPage() 命令。
如果您在 reportlab 中使用 platypus 引擎,您可以尝试覆盖BaseDocTemplate
该类并使用afterPage
andbeforePage
钩子来跟踪页码。然后,您可以在遇到偶数页时使用 showPage()。
例如:
from reportlab.platypus import BaseDocTemplate
from reportlab.lib.pagesizes import A4
from reportlab.platypus import PageTemplate
class MyDocTemplate(BaseDocTemplate):
"""Override the BaseDocTemplate class to split even/odd pages"""
def __init__(self, *args, **kwargs):
BaseDocTemplate.__init__(self, *args, **kwargs)
self.__pageNum = 1
def afterPage(self):
"""Called after all flowables have been drawn on a page"""
# Increment pageNum since the page has been completed
self.__pageNum += 1
def beforePage(self):
"""Called before any flowables are drawn on a page"""
# If the page number is even, force a page break
if self.__pageNum % 2 == 0:
self.canv.showPage()
# Increment pageNum again since we've added a blank page
self.__pageNum += 1
然后您可以使用新MyDocTemplate
类来创建您的文档:
if __name__ == "__main__":
doc = MyDocTemplate(
'filename.pdf',
pagesize=A4,
rightMargin=.3*inch,
leftMargin=.3*inch,
topMargin=.3*inch,
bottomMargin=.3*inch
)
# Your flowables go here
elements = []
# Your PageTemplates go here
doc.addPageTemplates([])
doc.build(elements)