5

我正在尝试使用 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 在左右(或奇偶)页面之间交替。有什么建议么?

4

1 回答 1

12

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

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

现在,我发现了什么:

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如果你这样做了)。

希望它有所帮助,并说它是否有效,我现在不能确定,但​​我会的!

于 2012-06-18T16:43:32.773 回答