5

Python 2.7 と ReportLab を使用して、奇数/偶数ページ レイアウトが異なる PDF ドキュメントを作成しようとしています (製本用の非対称境界線を許可するため)。問題をさらに複雑にするために、ページごとに 2 列を作成しようとしています。

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

私が推測する解決策を見つけました!:)

ソースコードを掘り下げる必要がありました。ファイルの 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._nextPageTemplateCycleif you do it があるため)。

それが役に立てば幸いです。うまくいくかどうかはわかりませんが、うまくいくと思います!

于 2012-06-18T16:43:32.773 に答える