Разделить длинный абзац

Я пытаюсь добавить длинные абзацы в свой документ отчета.

Это успешно, когда я просто добавляю весь текст, например:

self.story.append(Paragraph(text, STYLE_PARAGRAPH))

и построить его с помощью

self.doc.multiBuild(self.story, canvasmaker=MyCanvas)

Проблема в том, что разрывы строк (\n) не рассматриваются. Я пытался заменить их на <br/>, но это, похоже, не поддерживается утконосом, я получаю ошибку, что br тег неизвестен.

Моя следующая попытка состояла в том, чтобы разбить его на отдельные абзацы:

for p in text.replace('\r', '').split('\n'):
    self.story.append(Paragraph(p, STYLE_PARAGRAPH))

что приводит к:

reportlab.platypus.doctemplate.LayoutError: Splitting error(n==1) on page 47 in [...]

Есть идеи, что я делаю не так?

-- ОБНОВИТЬ --

Как сказал Адам, <br/> должно работать, но это не так в моем случае. После долгих часов отладки я обнаружил, что импорт был неправильным:

Правильный:

from reportlab.platypus import Paragraph

Мой импорт:

from reportlab.platypus.para import Paragraph

Хотя я понятия не имею, почему неправильный импорт работает в любом случае.

1 ответ

Решение

Тег разрыва строки <br/> должен работать с PLATYPUS, как показано на рис. 6-8 Руководства пользователя ReportLab на стр. 78. При самозакрывающемся разрыве строки возникает ошибка <br/> не используется Теги <br> а также </br> вызовет ошибку.

Я создал и протестировал короткий пример, чтобы продемонстрировать это с помощью длинного абзаца, который содержит разрывы строк. После третьего предложения и в конце абзаца есть два тега разрыва строки. Абзац был повторен, чтобы продемонстрировать его на нескольких страницах.

from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import SimpleDocTemplate, Paragraph

stylesheet = getSampleStyleSheet()
stylesheet.add(ParagraphStyle(name='Paragraph', spaceAfter=10))
elements = []
# Create a long paragraph with multiple line breaks.
paragraph = "Lorem ipsum dolor sit amet, consectetur adipiscing elit." * 3
paragraph += "<br/><br/>"
paragraph += "Lorem ipsum dolor sit amet, consectetur adipiscing elit." * 10
paragraph += "<br/><br/>"
paragraph *= 10
elements.append(Paragraph(paragraph, stylesheet['Paragraph']))
pdf = SimpleDocTemplate('example.pdf', pagesize=letter)
pdf.build(elements)
Другие вопросы по тегам