ReportLab 中的镜像边距
Mirror margins in ReportLab
如何在 ReportLab 中输出与 MSWord 函数“镜像边距”相同的结果?
例如:
奇数页:
{
右边边距:5,
左边距:10,
顶部边距:2,
底边距:2,
}
偶数页:
{
右边边距:10,
左边距:5,
顶部边距:2,
底边距:2,
}
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)
如何在 ReportLab 中输出与 MSWord 函数“镜像边距”相同的结果?
例如: 奇数页: { 右边边距:5, 左边距:10, 顶部边距:2, 底边距:2, } 偶数页: { 右边边距:10, 左边距:5, 顶部边距:2, 底边距:2, }
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)