【发布时间】: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
如何输出与 ReportLab 中名为“Mirror margins”的 MSWord 函数相同的结果?
例如: 奇数页: { rightMargin: 5, leftMargin:10, 上边距:2, 底部边距:2, } 偶数页: { rightMargin: 10, leftMargin:5, 上边距:2, 底部边距:2, }
【问题讨论】:
标签: python python-3.x reportlab
SimpleDocTemplate 有两个页面模板:First 和 Later。它呈现第一页并在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)
【讨论】: