Reportlab 中隐藏在段落中的溢出
overflow hidden on a Paragraph in Reportlab
我有一个 Table
有 2 个单元格,每个单元格里面有一个 Paragraph
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import cm
table_style_footer = TableStyle(
[
('LEFTPADDING', (0, 0), (-1, -1), 0),
('RIGHTPADDING', (0, 0), (-1, -1), 0),
('TOPPADDING', (0, 0), (-1, -1), 0),
('BOTTOMPADDING', (0, 0), (-1, -1), 0),
('BOX', (0, 0), (-1, -1), 1, (0, 0, 0)),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
]
)
style_p_footer = ParagraphStyle('Normal')
style_p_footer.fontName = 'Arial'
style_p_footer.fontSize = 8
style_p_footer.leading = 10
Table([
[
Paragraph('Send To:', style_p_footer),
Paragraph('Here should be a variable with long content', style_p_footer)
]
],
[1.7 * cm, 4.8 * cm],
style=table_style_footer
)
我需要隐藏段落的溢出内容,但是段落没有隐藏溢出内容而是换行。
Reportlab 似乎没有对隐藏溢出的原生支持,但我们可以利用 Paragraph
的 breakLines
功能来实现它。 breakLines
函数 returns 一个包含段落中给定宽度的所有行的对象,因此我们也可以使用它来找到第一行并丢弃其他所有内容。
基本上我们需要做以下事情:
- 创建一个虚拟段落
- 获取虚拟行
- 根据虚拟的第一行创建一个实际段落
在代码中执行此操作如下所示:
# Create a dummy paragraph to see how it would split
long_string = 'Here should be a variable with long content'*10
long_paragraph = Paragraph(long_string, style_p_footer)
# Needed because of a bug in breakLines (value doesn't matter)
long_paragraph.width = 4.8 * cm
# Fetch the lines of the paragraph for the given width
para_fragment = long_paragraph.breakLines(width=4.8 * cm)
# There are 2 kinds of returns so 2 ways to grab the first line
if para_fragment.kind == 0:
shorted_text = " ".join(para_fragment.lines[0][1])
else:
shorted_text = " ".join([w.text for w in para_fragment.lines[0].words])
# To make it pretty add ... when we break of the sentence
if len(para_fragment.lines) > 1:
shorted_text += "..."
# Create the actual paragraph
shorted_paragraph = Paragraph(shorted_text, style_p_footer)
我有一个 Table
有 2 个单元格,每个单元格里面有一个 Paragraph
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.units import cm
table_style_footer = TableStyle(
[
('LEFTPADDING', (0, 0), (-1, -1), 0),
('RIGHTPADDING', (0, 0), (-1, -1), 0),
('TOPPADDING', (0, 0), (-1, -1), 0),
('BOTTOMPADDING', (0, 0), (-1, -1), 0),
('BOX', (0, 0), (-1, -1), 1, (0, 0, 0)),
('VALIGN', (0, 0), (-1, -1), 'TOP'),
]
)
style_p_footer = ParagraphStyle('Normal')
style_p_footer.fontName = 'Arial'
style_p_footer.fontSize = 8
style_p_footer.leading = 10
Table([
[
Paragraph('Send To:', style_p_footer),
Paragraph('Here should be a variable with long content', style_p_footer)
]
],
[1.7 * cm, 4.8 * cm],
style=table_style_footer
)
我需要隐藏段落的溢出内容,但是段落没有隐藏溢出内容而是换行。
Reportlab 似乎没有对隐藏溢出的原生支持,但我们可以利用 Paragraph
的 breakLines
功能来实现它。 breakLines
函数 returns 一个包含段落中给定宽度的所有行的对象,因此我们也可以使用它来找到第一行并丢弃其他所有内容。
基本上我们需要做以下事情:
- 创建一个虚拟段落
- 获取虚拟行
- 根据虚拟的第一行创建一个实际段落
在代码中执行此操作如下所示:
# Create a dummy paragraph to see how it would split
long_string = 'Here should be a variable with long content'*10
long_paragraph = Paragraph(long_string, style_p_footer)
# Needed because of a bug in breakLines (value doesn't matter)
long_paragraph.width = 4.8 * cm
# Fetch the lines of the paragraph for the given width
para_fragment = long_paragraph.breakLines(width=4.8 * cm)
# There are 2 kinds of returns so 2 ways to grab the first line
if para_fragment.kind == 0:
shorted_text = " ".join(para_fragment.lines[0][1])
else:
shorted_text = " ".join([w.text for w in para_fragment.lines[0].words])
# To make it pretty add ... when we break of the sentence
if len(para_fragment.lines) > 1:
shorted_text += "..."
# Create the actual paragraph
shorted_paragraph = Paragraph(shorted_text, style_p_footer)