gpt4 book ai didi

python - reportlab 不同的下一页

转载 作者:太空狗 更新时间:2023-10-30 00:46:10 24 4
gpt4 key购买 nike

我正在尝试使用 Python 2.7 和 ReportLab 生成具有不同奇数/偶数页面布局(以允许不对称边框进行装订)的 PDF 文档。为了使事情更加复杂,我试图在每页上生成两列。

def WritePDF(files):

story = []
doc = BaseDocTemplate("Polar.pdf", pagesize=A4, title = "Polar Document 5th Edition")

oddf1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width/2-6, doc.height, id='oddcol1')
oddf2 = Frame(doc.leftMargin+doc.width/2+6, doc.bottomMargin, doc.width/2-6, doc.height, id='oddcol2')
evenf1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width/2-6, doc.height, id='evencol1')
evenf2 = Frame(doc.leftMargin+doc.width/2+6, doc.bottomMargin, doc.width/2-6, doc.height, id='evencol2')
doc.addPageTemplates([PageTemplate(id='EvenTwoC',frames=[evenf1,evenf2],onPage=evenFooter),
PageTemplate(id='OddTwoC', frames=[oddf1, oddf2], onPage=oddFooter)])


...

story.append(Paragraph(whatever, style))

我想不通的是如何让 ReportLab 在右页和左页(或奇数页和偶数页)之间交替。有什么建议吗?

最佳答案

我猜我找到了解决方案! :)

我不得不深入研究源代码。我在第 636 行的文件 reportlab/platypus/doctemplate.py 中找到了解决方案。这不是我第一次这样做,因为文档非常有限......

现在,我发现了什么:

def handle_nextPageTemplate(self,pt):
'''On endPage change to the page template with name or index pt'''
if type(pt) is StringType:
# ... in short, set self._nextPageTemplate
elif type(pt) is IntType:
# ... in short, set self._nextPageTemplate
elif type(pt) in (ListType, TupleType):
#used for alternating left/right pages
#collect the refs to the template objects, complain if any are bad
c = PTCycle()
for ptn in pt:
found = 0
if ptn=='*': #special case name used to short circuit the iteration
c._restart = len(c)
continue
for t in self.pageTemplates:
if t.id == ptn:
c.append(t)
found = 1
if not found:
raise ValueError("Cannot find page template called %s" % ptn)
if not c:
raise ValueError("No valid page templates in cycle")
elif c._restart>len(c):
raise ValueError("Invalid cycle restart position")

#ensure we start on the first one
self._nextPageTemplateCycle = c.cyclicIterator()
else:
raise TypeError("argument pt should be string or integer or list")

而且我检查了这个 self._nextPageTemplateCycle 的使用位置,所以这是我认为应该起作用的(尽管未测试):

story = []
# ...
# doc.addPageTemplates([...])

story.append(NextPageTemplate(['pageLeft', 'pageRight'])) # this will cycle through left/right/left/right/...

story.append(NextPageTemplate(['firstPage', 'secondPage', '*', 'pageLeft', 'pageRight'])) # this will cycle through first/second/left/right/left/right/...

当您想开始交替页面时,将其添加到故事中一次。使用另一个正常的 NextPageTemplate 来停止这个循环(因为在源代码中,如果你这样做的话,有一个 del self._nextPageTemplateCycle)。

希望它能有所帮助,如果它有效,请务必说明,我现在不能确定,但​​我会的!

关于python - reportlab 不同的下一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11042327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com