2012-06-14 6 views
3

Я пытаюсь создать PDF-документ с различными нечетными/четными макетами страниц (чтобы разрешить асимметричные границы для привязки) с использованием Python 2.7 и ReportLab. Чтобы еще больше усложнить ситуацию, я пытаюсь создать две колонки на страницу.reportlab different следующая страница

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 чередуются между правым и левым (или нечетных и четных) страниц. Какие-либо предложения?

+1

Я думаю, вам нужно [это] (http://www.reportlab.com/apis/reportlab/2.4/platypus.html#reportlab.platypus.doctemplate.NextPageTemplate), и там вы будете вычислять, является ли страница нечетной (справа) или даже (слева) (или наоборот) ... Мне нужно будет это проверить, и я отправлю ответ. – jadkik94

+0

Я могу (и имел) использовать функцию NextPageTemplate, чтобы установить, что следующая страница - например, после того, как я добавил Paragraph() s для (скажем) титульной страницы, я могу установить следующую страницу в другом стиле , Моя проблема заключается в том, что я автоматически набираю тысячи Paragraphs(), и я предполагаю, что мне нужно что-то сделать в BaseDocTemplate (или, возможно, в PageTemplate), который будет чередоваться между шаблонами страниц, чтобы левый шаблон устанавливал правильный шаблон для на следующей странице и наоборот. – TimGJ

ответ

5

Я нашел решение, я думаю! :)

Мне приходилось копаться в исходном коде. Я нашел решение в файле 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, если вы это сделаете).

Надеюсь, что это поможет, и скажите, работает ли он, я не могу убедиться прямо сейчас, но я буду!

+0

Doh! Да, спасибо, это действительно так просто. Единственное, что мне нужно было сделать, это то, что, поскольку я хотел, чтобы на первой странице был один столбец, мне пришлось добавить это, поскольку первая запись в списке объектов PageTemplate() добавлена ​​в объект doc. Большое вам спасибо - я действительно бил головой о стену. – TimGJ

+0

О! Reportlab так много раз давал это чувство ... И подумайте о принятии ответа, если это вам помогло;) [faq # howtoask] – jadkik94

Смежные вопросы