Arhn - архитектура программирования

Python reportlab динамически создает новую страницу после того, как первая страница полностью заполнена текстом

Python 3.8 x64 | Windows 10 x64 | reportlab v3.5.46 (с открытым исходным кодом)

Везде искал ответ на этот вопрос - безрезультатно. Я просто хочу создать PDF-документ, содержащий много текста. После того, как первая страница полностью заполнена текстом, оставшийся текст должен перетекать на вторую страницу. После того, как вторая страница полностью заполнена текстом, оставшийся текст должен перетекать на третью страницу (и так далее)...

Все ответы, которые я нахожу, ища по всему миру через Интернет, используют метод canvas.showPage(). Это не лучшее решение, потому что во всех этих примерах первая страница не полностью заполнена текстом, поэтому это ручной метод добавления новой страницы. В моем примере я не знаю, когда первая страница будет заполнена текстом, поэтому я не знаю, когда мне нужно создать вторую или новую страницу, используя canvas.showPage().

Мне нужно каким-то образом определить, когда первая страница больше не может содержать текст, и когда это произойдет, создайте новую страницу для хранения оставшегося текста.

Прочитав документацию reportlabs, я не уверен, как добиться этого в практической реализации Python. Существуют также методы platypus.PageBreak() и BaseDocTemplate.afterPage(), но я не уверен, что они делают, потому что документация по этим методам скудна.

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

from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.pagesizes import LETTER
from reportlab.lib.units import inch


def create_pdf_report_text_object(my_text):
    canvas = Canvas('Test.pdf', pagesize=LETTER)
    canvas.setFont('Helvetica', size=10)
    text_object = canvas.beginText(x=1 * inch, y=10 * inch)

    for line in my_text.splitlines(False):
        text_object.textLine(line.rstrip())

    canvas.drawText(text_object)
    canvas.save()
16.08.2020

Ответы:


1

Я считаю, что одним из решений вашего вопроса является использование фрейма, это означает, что фрейм воссоздается на каждой странице, пока не закончится текст. Рамка обнаружит, когда она заполнена.

См. приведенный ниже пример в качестве начала вашего собственного решения (все готово, просто скопируйте, вставьте и запустите код, должен быть создан pdf-файл с именем Example_output.pdf).

from reportlab.lib.pagesizes import letter
from reportlab.platypus import Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import BaseDocTemplate, PageTemplate, Flowable, FrameBreak, KeepTogether, PageBreak, Spacer
from reportlab.platypus import Frame, PageTemplate, KeepInFrame
from reportlab.lib.units import cm
from reportlab.platypus import (Table, TableStyle, BaseDocTemplate)

styleSheet = getSampleStyleSheet()

########################################################################

def create_pdf():
    """
    Create a pdf
    """

    # Create a frame
    text_frame = Frame(
        x1=3.00 * cm,  # From left
        y1=1.5 * cm,  # From bottom
        height=19.60 * cm,
        width=15.90 * cm,
        leftPadding=0 * cm,
        bottomPadding=0 * cm,
        rightPadding=0 * cm,
        topPadding=0 * cm,
        showBoundary=1,
        id='text_frame')

    # Create text

    L = [Paragraph("""What concepts does PLATYPUS deal with?""", styleSheet['Heading2']),
                          Paragraph("""
                         The central concepts in PLATYPUS are Flowable Objects, Frames, Flow
                         Management, Styles and Style Sheets, Paragraphs and Tables.  This is
                         best explained in contrast to PDFgen, the layer underneath PLATYPUS.
                         PDFgen is a graphics library, and has primitive commans to draw lines
                         and strings.  There is nothing in it to manage the flow of text down
                         the page.  PLATYPUS works at the conceptual level fo a desktop publishing
                         package; you can write programs which deal intelligently with graphic
                         objects and fit them onto the page.
                         """, styleSheet['BodyText']),

                          Paragraph("""
                         How is this document organized?
                         """, styleSheet['Heading2']),

                          Paragraph("""
                         Since this is a test script, we'll just note how it is organized.
                         the top of each page contains commentary.  The bottom half contains
                         example drawings and graphic elements to whicht he commentary will
                         relate.  Down below, you can see the outline of a text frame, and
                         various bits and pieces within it.  We'll explain how they work
                         on the next page.
                         """, styleSheet['BodyText']),
                          ]






    # Building the story
    story = L * 20 # (alternative, story.add(L))
    story.append(KeepTogether([]))

    # Establish a document
    doc = BaseDocTemplate("Example_output.pdf", pagesize=letter)

    # Creating a page template
    frontpage = PageTemplate(id='FrontPage',
                             frames=[text_frame]
                             )
    # Adding the story to the template and template to the document
    doc.addPageTemplates(frontpage)

    # Building doc
    doc.build(story)


# ----------------------------------------------------------------------
if __name__ == "__main__":
    create_pdf() # Printing the pdf 
26.08.2020
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..