python - ReportLab 中的镜像边距
问题描述
如何在 ReportLab 中输出与名为“Mirror margins”的 MSWord 函数相同的结果?
例如:奇数页:{ rightMargin:5,leftMargin:10, topMargin:2,bottomMargin:2,}偶数页:{ rightMargin:10,leftMargin:5, topMargin:2,bottomMargin: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)
推荐阅读
- r - 降低 R 中 arules 的支持阈值
- ios - React Native 在设备 iOS 崩溃上运行
- r - 调整标题
- javascript - 当从 ref 触发时,Safari 会忽略文件输入的 onChange
- javascript - 为什么 Web 元素仅随机抛出带有 TimedOut 原因的 CypressError?
- node.js - 列出带有附件的邮件的附件超时,否则快速返回
- python - 自定义标签(模板标签)未加载
- puppeteer - 避免使用 puppeteer 使用智能卡
- css - 为什么 -webkit-text-stroke 在 Chrome 和 Safari 上看起来不同?
- coldfusion - RequestDumperValve 中断 POST 请求