ReportLab. Плавающий текст с двумя столбцами

Прежде всего, я новичок в python, reportlab, xhtml2pdf. Я уже сделал свои первые PDF-файлы с reportlab, но столкнулся со следующей проблемой.

Мне нужен большой текст в две колонки.

Сначала я создаю свой холст, создаю свою историю, добавляю свой большой текст в виде абзаца к истории, создаю мою рамку и, наконец, добавляю историю в рамку.

c = Canvas("local.pdf")
storyExample = []
textExample = (""" This is a very large text Lorem Ipsum ... """)
storyExample.append(Paragraph(textExample, styleText))
frameExample = Frame(0, 0, 50, 50,showBoundary=0)
frameExample.addFromList(storyExample,c)
c.showPage()
c.save()

Работает как шарм. Но мне нужно показать текст в двух колонках.

Теперь текст просто течет, бросил мою рамку так:

|aaaaaaaaaaaaaaaaaaaa|
|bbbbbbbbbbbbbbbbbbbb|
|cccccccccccccccccccc|
|dddddddddddddddddddd|

Но мне нужно это так:

|aaaaaaaaa  bbbbbbbbbb|
|aaaaaaaaa  cccccccccc|
|bbbbbbbbb  cccccccccc|
|bbbbbbbbb  dddddddddd|

Я надеюсь, вы поняли, что я пытаюсь сказать.

2 ответа

Решение

Это можно сделать с помощью BaseDocTemplate а также Frame как вы можете прочитать здесь. Я изменил этот рецепт, чтобы использовать только два кадра макета:

from reportlab.platypus import BaseDocTemplate, Frame, Paragraph, PageBreak, PageTemplate
from reportlab.lib.styles import getSampleStyleSheet
import random

words = "lorem ipsum dolor sit amet consetetur sadipscing elitr sed diam nonumy eirmod tempor invidunt ut labore et".split()

styles=getSampleStyleSheet()
Elements=[]

doc = BaseDocTemplate('basedoc.pdf',showBoundary=1)

#Two Columns
frame1 = Frame(doc.leftMargin, doc.bottomMargin, doc.width/2-6, doc.height, id='col1')
frame2 = Frame(doc.leftMargin+doc.width/2+6, doc.bottomMargin, doc.width/2-6, doc.height, id='col2')

Elements.append(Paragraph(" ".join([random.choice(words) for i in range(1000)]),styles['Normal']))
doc.addPageTemplates([PageTemplate(id='TwoCol',frames=[frame1,frame2]), ])


#start the construction of the pdf
doc.build(Elements)

Если вы хотите сделать это в простом ReportLab, вам придется самостоятельно определить, где можно разбить абзац. Если вместо этого вы используете Platypus для настройки класса документа, вы можете указать фреймы для размещения текста на странице, и порядок фреймов определит, куда все будет переходить. Когда абзац достигает конца первого фрейма в левой части страницы, содержимое автоматически переходит в следующий фрейм, который вы можете расположить в правой части страницы, чтобы достичь желаемого.

Другие вопросы по тегам