'Python Reportlab - Wordwrap on Table is splitting words rather than at spaces

I created a PDF in reportlab using a canvas:

self.pdf = canvas.Canvas(f'{file_name}.pdf', pagesize=A4)

I create tables within tables to create my document but one of my tables is not wrapping the way I expect it to. Rather than linebreaking at spaces, it does so between words as seen below. enter image description here

The code below is the code I used to create the table. It is a bit long as I did make sure that the cells I'm passing into the Table() are all Paragraph().

def _discount_table(self, width_list):
    # Table Name
    table_name = Paragraph('DISCOUNTS', self.header_style_grey)

    # Create Header
    header = [Paragraph('NAME', self.table_header_style_left)]
    header += [Paragraph(x, self.table_header_style_right) for x in self.unique_discount_list]
    header += [Paragraph('TOTAL', self.table_header_style_right)]

    # Process Data
    discount_data = [[Paragraph(cell, self.table_style2) for cell in row] for row in self.discount_data]
    data = [[child_row[0]] + disc for child_row, disc in zip(self.fees_data, discount_data)]

    # Create Footer
    table_footer = [Paragraph('') for _ in range(len(header) - 2)]
    table_footer += [Paragraph('TOTAL', self.table_header_style_right),
                     Paragraph(f'{self.discount_total:,.2f}', self.table_header_style_right)]

    # Create Table
    bg_color = self.header_style_grey.textColor
    table = Table([header] + data + [table_footer], colWidths=width_list)
    table.setStyle([
        ('GRID', (0, 0), (-1, -1), 1, 'black'),
        ('BACKGROUND', (0, 0), (-1, 0), bg_color),
        ('TEXTCOLOR', (0, 0), (-1, 0), 'white'),
        ('BACKGROUND', (-2, -1), (-1, -1), bg_color),
        ('TEXTCOLOR', (-2, -1), (-1, -1), 'white'),
        ('FONTNAME', (-2, -1), (-1, -1), 'Helvetica-Bold'),
        ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'),
        ('ALIGN', (1, 0), (-1, -1), 'RIGHT'),
        ('ROWBACKGROUNDS', (0, 1), (-1, -2), ['lightgrey', 'white']),
    ])

    return [table_name, table]

(To note that child_row[0] is already a Paragraph - this is found on the line 12 above)

The styling I used is imported from another python file as follows:

    self.table_style2 = ParagraphStyle('table_style')
    self.table_style2.wordWrap = 'CJK'
    self.table_style2.alignment = TA_RIGHT

    self.table_style = ParagraphStyle('table_style')
    self.table_style.wordWrap = 'CJK'

    self.table_header_style_right = ParagraphStyle('table_header_style', self.table_style)
    self.table_header_style_right.textColor = colors.HexColor('#FFFFFF')
    self.table_header_style_right.fontName = 'Helvetica-Bold'
    self.table_header_style_right.alignment = TA_RIGHT
    self.table_header_style_right.wordWrap = 'CJK'

    self.table_header_style_left = ParagraphStyle('table_header_style', self.table_style)
    self.table_header_style_left.textColor = colors.HexColor('#FFFFFF')
    self.table_header_style_left.fontName = 'Helvetica-Bold'
    self.table_header_style_left.wordWrap = 'CJK'

So I am really lost and need help. Why is the table not wrapping correctly?



Solution 1:[1]

I was able to fix the table wrap issue when I removed the wordWrap = 'CJK' portion of the code. I saw in a video that a Paragraph() will automatically wordWrap so I'm guessing there was some issue with how those two elements overlap

self.table_style2 = ParagraphStyle('table_style')
# self.table_style2.wordWrap = 'CJK'
self.table_style2.alignment = TA_RIGHT

self.table_style = ParagraphStyle('table_style')
# self.table_style.wordWrap = 'CJK'

self.table_header_style_right = ParagraphStyle('table_header_style', self.table_style)
self.table_header_style_right.textColor = colors.HexColor('#FFFFFF')
self.table_header_style_right.fontName = 'Helvetica-Bold'
self.table_header_style_right.alignment = TA_RIGHT
# self.table_header_style_right.wordWrap = 'CJK'

self.table_header_style_left = ParagraphStyle('table_header_style', self.table_style)
self.table_header_style_left.textColor = colors.HexColor('#FFFFFF')
self.table_header_style_left.fontName = 'Helvetica-Bold'
# self.table_header_style_left.wordWrap = 'CJK'

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Teacher Mik