Вот пример кода который создаст подобную таблицу. Используется fpdf2
и .multi_cell
:
from fpdf import FPDF, XPos, YPos
datas = [{"IP": ["2.2.2.2", "3.3.3.3"],
"ports": ["80/http", "443/https"],
"domains": [{"domain": "example1.com",
"web_techn": ['example_webtechn1','example_webtechn2']},
{"domain": "example2.com",
"web_techn": ['example_webtechn3','example_webtechn4']},
{"domain": "example3.com",
"web_techn": ['example_webtechn5','example_webtechn6']}],
"URLs": [ "https://2.2.2.2/ - 200", "http://2.2.2.2/ - 200"],
"technologys": ['example_techn1','example_techn2']},
{"IP": ["2.2.2.2", "3.3.3.3"],
"ports": ["80/http", "443/https"],
"domains": [{"domain": "example1.com",
"web_techn": ['example_webtechn1','example_webtechn2']},
{"domain": "example2.com",
"web_techn": ['example_webtechn3','example_webtechn4']},
{"domain": "example3.com",
"web_techn": ['example_webtechn5','example_webtechn6']}],
"URLs": [ "https://2.2.2.2/ - 200", "http://2.2.2.2/ - 200"],
"technologys": ['example_techn1','example_techn2']},]
pdf = FPDF() # Создаём новый документ
pdf.add_page() # Добавляем страницу
pdf.set_xy(1, 1) # Удаляем белые границы
pdf.set_font("Times", size=16) # Устанавливаем шрифт
for data in datas:
line_height = pdf.font_size * 2.5 * (len(data['domains']) * 2) # Находим необходимую высоту строки
col_width = pdf.epw / 7 # Находим необходимую ширину строки
# Выводим главную часть таблицы
pdf.multi_cell(col_width, line_height,'\n'.join(data['IP']),
border=1, new_y=YPos.TOP, max_line_height=pdf.font_size)
pdf.multi_cell(col_width, line_height,'\n'.join(data['ports']),
border=1, new_y=YPos.TOP, max_line_height=pdf.font_size)
pdf.multi_cell(col_width * 2, line_height,'\n'.join(data['technologys']) + '\n' + '\n'.join(data['URLs']),
border=1, new_y=YPos.TOP, max_line_height=pdf.font_size)
# Находим высоту для подразбитых ячеек
line_height /= len(data['domains'])
for domain in data['domains']:
pdf.multi_cell(col_width * 1.5, line_height, domain['domain'],
border=1, new_y=YPos.TOP, max_line_height=pdf.font_size)
pdf.multi_cell(col_width * 2, line_height, '\n'.join(domain['web_techn']),
border=1, new_y=YPos.NEXT, new_x=XPos.LEFT, max_line_height=pdf.font_size)
pdf.set_x(pdf.x - col_width * 1.5) # Перемещяемся назад по x к началу под разбитых ячеек
pdf.set_x(1) # Переходим в начало по оси x
pdf.output('table.pdf')