ReportLab 中的镜像边距

Mirror margins in ReportLab

如何在 ReportLab 中输出与 MSWord 函数“镜像边距”相同的结果?

例如: 奇数页: { 右边边距:5, 左边距:10, 顶部边距:2, 底边距:2, } 偶数页: { 右边边距:10, 左边距:5, 顶部边距:2, 底边距:2, }

SimpleDocTemplate 有两个页面模板:FirstLater。它呈现第一页,并在 handle_pageBegin 上将下一页模板设置为 Later。我们可以覆盖这个行为并循环我们的两个名为 LeftRight.

的模板

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)