【问题标题】:Mirror margins in ReportLabReportLab 中的镜像边距
【发布时间】:2021-04-28 23:40:52
【问题描述】:

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

例如: 奇数页: { rightMargin: 5, leftMargin:10, 上边距:2, 底部边距:2, } 偶数页: { rightMargin: 10, leftMargin:5, 上边距:2, 底部边距:2, }

【问题讨论】:

    标签: python python-3.x reportlab


    【解决方案1】:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 2011-05-18
      • 2017-12-23
      相关资源
      最近更新 更多