Проблемы выравнивания и ширины Reportlab

У меня возникли некоторые проблемы с reportlab и записью PDF. Когда PDF записывается, он занимает только чуть меньше 2/3 ширины страницы (буквы). Заголовок, например, заворачивается и не доходит до половины документа

Я в растерянности, как заставить мои таблицы и параграф использовать всю ширину страницы.

Любое понимание будет высоко оценено.

Заранее спасибо.


import io
import os
from django.core.files.base import ContentFile
from jsignature.utils import draw_signature
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_RIGHT, TA_CENTER, TA_LEFT
from reportlab.lib.units import inch
from reportlab.pdfgen import canvas
from reportlab.platypus import SimpleDocTemplate, Paragraph, Table
from PIL import Image


# create pdf with table and paragraphs
def create_pdf(participant):
    # create a file-like buffer to receive PDF data
    buffer = io.BytesIO()
    # define styles
    styles = getSampleStyleSheet()
    style_general = ParagraphStyle(
        name='left',
        parent=styles['Normal'],
        fontSize=12,
        fontName='Helvetica',
        alignment=TA_LEFT)
    style_image = ParagraphStyle(
        name='left',
        fontSize=30,
        parent=styles['Normal'],
        alignment=TA_LEFT)
    style_heading = ParagraphStyle(
        name='center',
        fontSize=18,
        fontName='Helvetica-Bold',
        parent=styles['Heading1'],
        leading=18,
        alignment=TA_CENTER)
    # create a simple document with page size in buffer
    doc = SimpleDocTemplate(buffer, pagesize=letter, author='Me')
    # create a list of paragraphs
    AllParagraphs = []
    # convert png image to jpeg
    jpeg_image = get_jpeg_image(participant)
    # add rows and columns so that the data can align
    table_data = [
        [Paragraph("My Heading - It should span the full page width", style_heading)],
        [
            Paragraph('Name:', style_general),
            Paragraph(
                f'{participant.first_name} {participant.middle_initial} {participant.last_name}',
                style_general)
        ],
        [
            Paragraph(f'Signature:', style_general),
            # image height of 30 to prevent overlapping since fontSize is 30,
            # image width of double to maintain aspect ratio
            Paragraph(
                "<img src='{0}' valign='middle' width=60 height=30 />".format(
                    jpeg_image),
                style_image)
        ]
    ]
    # set rows and columns into Table object
    table_element = Table(table_data)
    # add table to list of paragraphs
    AllParagraphs.append(table_element)
    # build document with list of paragraphs
    doc.build(AllParagraphs)

    # get content of buffer
    buffer.seek(0)
    pdf_data = buffer.getvalue()
    # save buffer content to django File object
    file_data = ContentFile(pdf_data)
    # name pdf file
    file_data.name = f'{participant.last_name}.pdf'
    # delete jpeg file
    os.remove(jpeg_image)
    # save pdf file to parent model
    participant.pdf = file_data
    participant.save()



Для тех, кого интересует ответ: настройка стиля таблицы для охвата нескольких столбцов была правильным подходом.

В данном случае таблица используется для наилучшего выравнивания элементов подписи, поэтому выравнивание столбцов аналогично тому, как это делается в html или css, является решением.

...
    # existing code for placement reference
    # set rows and columns into Table object
    table_element = Table(table_data)
    # add table to list of paragraphs

    # new code for spanning
    # style table object to make single cells span both columns
    table_element.setStyle(TableStyle([
        ('SPAN', (0, 0), (1, 0)),
    ]))
Вернуться на верх