0

我正在尝试使用 FPDF 库创建一个表格,该表格能够在文本非常大时扩展单元格的高度。

我将展示我拥有的代码,这与官方文档页面上的代码相同:

from fpdf import FPDF

data = (
    ("First name", "Last name", "Age", "City"),
    ("Jules", "Smith", "34", "San Juan"),
    ("Mary", "Ramos", "45", "Orlando"),
    ("Carlson", "Banks", "19", "Los Angeles"),
    ("Lucas", "Cimon", "31", "Saint-Mahturin-sur-Loire udfhisudhf fughdiufhg fduihgsdiufg dfghsdifugh fdiguhdsfiug fdughdifugh dfhgsdiufhg"),
)

pdf = FPDF()
pdf.add_page()
pdf.set_font("Times", size=10)
line_height = pdf.font_size * 2.5
col_width = pdf.epw / 4 
for row in data:
    for datum in row:
        pdf.multi_cell(col_width, line_height, datum, border=1, ln=3)
    pdf.ln(line_height)
pdf.output('table_with_cells.pdf')

这是结果:

PDF 结果

最后一行的最后一列更高,因为它有更多内容,这很好,但我希望该行中所有列的高度动态相同。像这样的东西:

我想要这个结果

我怎么才能得到它?

注意:表中的数据来自数据库,所以我无法确切知道每个字符串的长度

4

1 回答 1

1

对你来说可能为时已晚,但既然我们已经到了……

假设:
与 FPDF 一样,为了调整 'line_height' 和 'col_width' 参数以在单元格/多单元格方法中使用......您必须了解数据的内容,至少是最长单词的最大长度你的桌子。否则...您必须根据您的知识设置一些合理的最大界限。
例如,使用您的数据来设置 line_height ...不可读。但是你可以很确定,世界上没有人有这么长的名字。=) 因此,即使您不知道表格第一列中的所有元素,您也可以确信 2.5 是一个合理的因素。

无论如何......
这里唯一的解决方案是预先计算每个单元格的单词数,为每个包含许多“N”单词的字符串的数据行定义一个新的、好的、唯一的 line_height。这个新的 line_height 取决于你的长字符串的字数。最后,您可以根据当前行轻松创建表格,选择适当的 line_height。

from fpdf import FPDF

data = (
    ("First name", "Last name", "Age", "City"),
    ("Jules", "Smith", "34", "San Juan"),
    ("Mary", "Ramos", "45", "Orlando"),
    ("Carlson", "Banks", "19", "Los Angeles"),
    ("Milano Roma Firenze Venezia Genova Napoli Livorno Bergamo Siracusa \       
    Rimini Pisa Bologna Brescia Torino"),
    )
pdf = FPDF()
pdf.add_page()
pdf.set_font("Times", size=10)
line_height = pdf.font_size * 2.5
col_width = pdf.epw / 4.5

lh_list = [] #list with proper line_height for each row
use_default_height = 0 #flag

#create lh_list of line_heights which size is equal to num rows of data
for row in data:
    for datum in row:
        word_list = datum.split()
        number_of_words = len(word_list) #how many words
        if number_of_words>2: #names and cities formed by 2 words like Los Angeles are ok)
            use_default_height = 1
            new_line_height = pdf.font_size * (number_of_words/2) #new height change according to data 
    if not use_default_height:
        lh_list.append(line_height)
    else:
        lh_list.append(new_line_height)
        use_default_height = 0

#create your fpdf table ..passing also max_line_height!
for j,row in enumerate(data):
    for datum in row:
        line_height = lh_list[j] #choose right height for current row
        pdf.multi_cell(col_width, line_height, datum, border=1,align='L',ln=3, 
        max_line_height=pdf.font_size)
    pdf.ln(line_height)

pdf.output('table_with_cells.pdf')

在此处输入图像描述

于 2022-01-29T14:23:13.897 回答