Python FPDF Как отображать в 2 столбцах и не разделять адреса при создании новой страницы

#python #fpdf

#python #fpdf

Вопрос:

«‘ Модуль должен считывать адреса из текстового файла, раскладывать их в две колонки, готовые для печати на самоклеящейся бумаге формата А4.

Код, который у меня есть, в порядке. Но мне нужно, чтобы он отображался в 2 столбцах и не разделял адреса при создании новой страницы.

Адреса различаются по размеру от 4 до 7 строк текста.

Я изучил чужой код, но не могу понять, как достичь своей цели. Любая помощь будет высоко оценена «. ‘

 import os,sys
from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font('arial', '', 14)
w = 80

file = open(os.path.join(sys.path[0], 'addressbookMultiPrint.txt'))
for i, line in enumerate(file.readlines()):
    
    if i == 0:
        pdf.cell(w, 3, '', 'TLR', 1)
        
    pdf.cell(w, 7, line, 'LR', 1)
    
    if line == 'n':
        pdf.cell(w, 1, '', 'BLR', 1)
        pdf.cell(w, 3, ' ', 0, 1)
        pdf.cell(w, 3, '', 'TLR', 1)

pdf.output('single.pdf')
os.startfile('single.pdf')#,'print')
 

Ответ №1:

Лучший способ — использовать HTML.

Вам нужно сделать таблицу в HTML.

  1. Импортируйте HTMLMixin. Не забудьте установить FPDF2

    pip install fpdf2

    from fpdf import FPDF, HTMLMixin

  2. Теперь нам нужна переменная со всем HTML-кодом
     html = '''
    <table width="100%">
    <tr><th width="50%">Header #1</th><th width="50%">Header #2</th></tr>
    '''
 

Вы можете изменить 100% в таблице, если не хотите делать ее такой широкой.

В th вы также можете изменить 50%, если некоторые столбцы должны быть шире, но в целом это должно быть 100%. (Даже если ваша таблица не на 100%)

  1. Ваш код с данными
 html  = "<tr><td>"   name   "</td><td>"   surname   "</td></tr>"
 
  1. Не забудьте закрыть тег таблицы
 html  = "</table>"
 
  1. Теперь, когда весь HTML готов, передайте его в новый класс
 class PDF(FPDF, HTMLMixin):
    pass

pdf = FPDF()
pdf.add_page()
pdf.set_font('arial', '', 14)
pdf.write_html(html)
pdf.output('single.pdf', 'F')
 

Для получения дополнительной информации проверьте это