reporlab - перевод строки в Table

daradan

Новичок
Пользователь
Май 18, 2020
7
0
1
Здравствуйте.
Помогите пожалуйста сделать перевод строки в таблице.
Python:
import sqlite3
from reportlab.platypus import SimpleDocTemplate
from reportlab.lib.pagesizes import A4, mm
from reportlab.platypus import Table, TableStyle
from reportlab.lib import colors
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import inch
styles = getSampleStyleSheet()
Title = "Отчет такой-то"


def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('DejaVuSerif',18)
    canvas.drawCentredString(300, 780, Title)
    canvas.setFont('DejaVuSerif', 9)
    canvas.drawString(7.25 * inch, 0.75 * inch, "1")
    canvas.restoreState()



def create_report(title='Тестовый отчет'):
    pdfmetrics.registerFont(TTFont('DejaVuSerif', 'DejaVuSerif.ttf', 'UTF-8'))

    fileName = 'pdfTable.pdf'

    pdf = SimpleDocTemplate(
        fileName,
        pagesize=A4
    )
    pdf.title = title
    table = Table(temp_data, colWidths=(None, None, None, None, None, None, None, 30*mm))

    style_sup_cyrillic = TableStyle([('FONTNAME', (0, 0), (-1, -1), 'DejaVuSerif')])
    table.setStyle(style_sup_cyrillic)

    style_header = TableStyle([
        ('BACKGROUND', (0, 0), (8, 0), colors.green),
        ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke),
        ('BACKGROUND', (0, 1), (-1, -1), colors.beige),
    ])
    table.setStyle(style_header)

    rowNumb = len(temp_data)
    for i in range(1, rowNumb):
        if i % 2 == 0:
            bc = colors.burlywood
        else:
            bc = colors.beige
        ts = TableStyle(
            [('BACKGROUND', (0, i), (-1, i), bc)]
        )
        table.setStyle(ts)

    ts = TableStyle(
        [
            ('BOX', (0, 0), (-1, -1), 1, colors.black),
            ('GRID', (0, 0), (-1, -1), 1, colors.black)
        ]
    )
    table.setStyle(ts)

    elems = []
    elems.append(table)
    pdf.build(elems, onFirstPage=myLaterPages)

# conn = sqlite3.connect('oib.db')
# cursor = conn.cursor()
# list_from_table = map(list, cursor.execute('SELECT * FROM journal_usb;'))
# headers = ['ID', 'ID СНИ', 'Фамилия', 'Имя', 'Отчество', 'Основание', 'Дата', 'Примечание']
temp_data = [['ID', 'ID СНИ', 'Фамилия', 'Имя', 'Отчество', 'Основание', 'Дата', 'Примечание'],
             [1, '111', 'Петров', 'Петр', 'Петрович', '222', '2020-07-07', 'просто так'],
             [2, '333', 'Иванов', 'Иван', 'Иванович', '444', '2020-07-07', 'вероятно просто так'],
             [3, '555', 'Ахмедов', 'Ахмед', 'Ахмедович', '666', '2020-07-07', 'сказали дать доступ ))'],
             [4, '777', 'Петров', 'Петр', 'Петрович', '888', '2020-07-07', 'и снова он'],
             [5, '999', 'Омаров', 'Омар', 'Омарович', '101010', '2020-07-07', 'новенький'],
             [6, '111111', 'Тимофеев', 'Тимофей', 'Тимофеевич', '121212', '2020-07-07', 'какое ФИО ))'],
             [7, '131313', '1_кварталов', '1_квартал', '1_кварталович', '141414', '2020-03-08', \
              'вапроватплватплвать авпвадлптьлдвапьт валпьвдалпь вальдвлапьдлваьд вальидвальидваль']]
# for k in list_from_table:
#     temp_data.append(k)
# temp_data.insert(0, headers)

create_report()
тут советуют использовать
Python:
styles = getSampleStyleSheet()
styleN = styles['Normal']
styleN.wordWrap = 'CJK'
Как пример брал оттуда же весь скрипт и пробовал. Но то не мог запустить отображение кириллицы через шрифт DejaVuSerif.ttf, то не мог добавить текст до и после таблицы.
В итоге получаю такой pdf
pdfTable.pdf.png
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Помогите пожалуйста сделать перевод строки в таблице.
Можно просто через \n делать или написать функцию, которая принимает строку и делит ее через заданное количество символов с помощью \n.
Вот пример с использованием \n:
Python:
temp_data = [['ID', 'ID СНИ', 'Фамилия', 'Имя', 'Отчество', 'Основание', 'Дата', 'Примечание'],
             [1, '111', 'Петров', 'Петр', 'Петрович', '222', '2020-07-07', 'просто так'],
             [2, '333', 'Иванов', 'Иван', 'Иванович', '444', '2020-07-07', 'вероятно\n просто так'],
             [3, '555', 'Ахмедов', 'Ахмед', 'Ахмедович', '666', '2020-07-07', 'сказали\n дать доступ ))'],
             [4, '777', 'Петров', 'Петр', 'Петрович', '888', '2020-07-07', 'и снова он'],
             [5, '999', 'Омаров', 'Омар', 'Омарович', '101010', '2020-07-07', 'новенький'],
             [6, '111111', 'Тимофеев', 'Тимофей', 'Тимофеевич', '121212', '2020-07-07', 'какое ФИО ))'],
             [7, '131313', '1_кварталов', '1_квартал', '1_кварталович', '141414', '2020-03-08', \
              'вапроват\nплватплвать \nавпвадлпт\nьлдвапьт \nвалпьвдал\nпь вальдвлап\nьдлваьд вальи\nдвальидваль',]]
 
  • Мне нравится
Реакции: daradan

daradan

Новичок
Пользователь
Май 18, 2020
7
0
1
Можно просто через \n делать или написать функцию, которая принимает строку и делит ее через заданное количество символов с помощью \n.
Спасибо за подсказку.
В итоге перед запуском функции
Python:
create_report()
прописал
Python:
n = 0
for k in temp_data:
    temp_data[n][7] = chop_line(k[7])
    n += 1
и сама функция получилась так
Python:
def chop_line(comments, maxline=13):
    if len(comments) > maxline:
        cant = len(comments) // maxline
        cant += 1
        strline = ""
        index = maxline
        for k in range(1, cant):
            index = maxline * k
            strline += "%s\n" % (comments[(index - maxline):index])
        strline += "%s" % (comments[index:])
        return strline
    else:
        return comments
В итоге теперь pdf выглядит так
pdfTable.pdf.png
 

Форум IT Специалистов