首页 > 解决方案 > ReportLab 中的镜像边距

问题描述

如何在 ReportLab 中输出与名为“Mirror margins”的 MSWord 函数相同的结果?

例如:奇数页:{ rightMargin:5,leftMargin:10, topMargin:2,bottomMargin:2,}偶数页:{ rightMargin:10,leftMargin:5, topMargin:2,bottomMargin:2,}

标签: pythonpython-3.xreportlab

解决方案


SimpleDocTemplate有两个页面模板:FirstLater. 它呈现第一页并将handle_pageBegin下一页模板设置为Later. 我们可以覆盖此行为并循环遍历名为Left和的两个模板Right


from reportlab.platypus import SimpleDocTemplate, PageTemplate
from reportlab.platypus.paragraph import Paragraph
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import *
from reportlab.platypus.frames import Frame
from reportlab.lib.units import inch, cm, mm
import random

class MirrorMarginsDocTemplate(SimpleDocTemplate):
    
    def handle_pageBegin(self):
        self._handle_pageBegin()
        nextPageTemplate = {'Left':'Right','Right':'Left'}
        self._handle_nextPageTemplate(nextPageTemplate[self.pageTemplate.id])
        
    def build(self, *args, **kwargs):
        frameLeft = Frame(self.leftMargin, self.bottomMargin, self.width, self.height, id='frameLeft', showBoundary=0)
        frameRight = Frame(self.rightMargin, self.bottomMargin, self.width, self.height, id='frameRight', showBoundary=0)
        self.addPageTemplates([
            PageTemplate(id='Left', frames=frameLeft, pagesize=self.pagesize),
            PageTemplate(id='Right', frames=frameRight, pagesize=self.pagesize)
        ])
        super().build(*args,**kwargs)

def lorem(minLen, maxLen, count):
    words = "quis voluptas natus excepturi veritatis pariatur nostrum nulla enim expedita eum illum sit molestias earum dolor corporis".split(" ")
    def cap(word):
        return word[:1].upper() + word[1:]
    def rand_word(comma):
        return random.choice(words) if not comma else random.choice(words) + ","
    def content():
        return " ".join(
            [cap(rand_word(False))] 
            + [rand_word(random.randint(0,15) == 0) for i in range(random.randint(minLen-2, maxLen-2))]
            + [rand_word(False)]
            ) + "."
    style = ParagraphStyle(name='Normal', spaceAfter=6, alignment=TA_JUSTIFY)
    return [Paragraph(content(), style) for i in range(count)]

if __name__ == "__main__":
    doc = MirrorMarginsDocTemplate("test.pdf", leftMargin = 10 * mm, rightMargin = 5 * mm, topMargin = 2 * mm, bottomMargin = 2 * mm)
    flowables = lorem(50, 100, 50)
    doc.build(flowables)

推荐阅读