You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用borb的HeterogeneousParagraph添加多样式长段落遇宽度超限错误

解决borb库HeterogeneousParagraph宽度超限错误,实现多样式长段落排版

问题描述

使用borb库的HeterogeneousParagraph组件创建包含多种字体样式的长段落时,触发AssertionError,提示组件宽度超出页面/列可用范围(需要1787pts,仅476pts可用),无法实现带局部样式的自动换行长文本排版。

复现代码

page = Page(width=Decimal(256), height=Decimal(256))
layout.add(
            HeterogeneousParagraph(
                [
                    ChunkOfText("Lorem "),
                    ChunkOfText("ipsum ", font_color=HexColor("56cbf9")),
                    ChunkOfText("dolor ", font_size=Decimal(8)),
                    ChunkOfText("sit ", font="Helvetica-Bold"),
                    ChunkOfText(
                        "sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk us Ifsk. "
                        "us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk.  us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk.",
                        font="Helvetica-Oblique"),
                ], text_alignment=Alignment.LEFT,respect_newlines_in_text=True,
            )
        )

错误栈

File "C:\Users\XXXXXX\Desktop\PDFPOC\venv\Lib\site-packages\flask\app.py", line 880, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\XXXXXX\Desktop\PDFPOC\venv\Lib\site-packages\flask\app.py", line 865, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\XXXXXX\Desktop\PDFPOC\WebService.py", line 27, in hello
    obj.main(person)
  File "C:\Users\XXXXXX\Desktop\PDFPOC\NGG0027.py", line 379, in main
    layout.add(
  File "C:\Users\XXXXXX\Desktop\PDFPOC\venv\Lib\site-packages\borb\pdf\canvas\layout\page_layout\multi_column_layout.py", line 221, in add
    assert False, f"{layout_element.__class__.__name__} is too wide to fit inside column / page. Needed {round(layout_box.get_width())} pts, only {round(available_box.get_width())} pts available."
           ^^^^^
AssertionError: HeterogeneousParagraph is too wide to fit inside column / page. Needed 1787 pts, 
only 476 pts available.

解决方案

1. 移除respect_newlines_in_text=True参数

该参数会强制borb将文本内容视为不可拆分的整体,禁止自动换行,直接导致长文本超出页面宽度。删除该参数后,borb会自动根据可用宽度对文本进行换行处理。

修改后的代码:

layout.add(
    HeterogeneousParagraph(
        [
            ChunkOfText("Lorem "),
            ChunkOfText("ipsum ", font_color=HexColor("56cbf9")),
            ChunkOfText("dolor ", font_size=Decimal(8)),
            ChunkOfText("sit ", font="Helvetica-Bold"),
            ChunkOfText(
                "sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk us Ifsk. "
                "us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk.  us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk.",
                font="Helvetica-Oblique"),
        ], 
        text_alignment=Alignment.LEFT
    )
)

2. 调整页面尺寸或边距

若需保留小尺寸页面(当前为256x256pts),可通过缩小页面边距增加可用宽度:

from borb.pdf.canvas.layout.page_layout.multi_column_layout import MultiColumnLayout

page = Page(width=Decimal(256), height=Decimal(256))
# 设置更小的边距,增加可用排版空间
layout = MultiColumnLayout(
    page, 
    margin_top=Decimal(10), 
    margin_bottom=Decimal(10), 
    margin_left=Decimal(10), 
    margin_right=Decimal(10), 
    number_of_columns=1
)

也可以直接使用标准页面尺寸(如A4),从根源解决宽度不足问题:

from borb.pdf.page.page_size import PageSize

page = Page(width=PageSize.A4_PORTRAIT.value[0], height=PageSize.A4_PORTRAIT.value[1])

3. 拆分超长文本Chunk

如果业务场景必须保留respect_newlines_in_text参数,可将单个超长的ChunkOfText拆分为多个较小的Chunk,让borb能够在Chunk之间进行换行:

layout.add(
    HeterogeneousParagraph(
        [
            ChunkOfText("Lorem "),
            ChunkOfText("ipsum ", font_color=HexColor("56cbf9")),
            ChunkOfText("dolor ", font_size=Decimal(8)),
            ChunkOfText("sit ", font="Helvetica-Bold"),
            # 拆分超长文本为多个Chunk
            ChunkOfText("sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf ", font="Helvetica-Oblique"),
            ChunkOfText("sk us Ifsk us Ifsk usf us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf ", font="Helvetica-Oblique"),
            ChunkOfText("sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk us Ifsk. ", font="Helvetica-Oblique"),
            ChunkOfText("us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk. ", font="Helvetica-Oblique"),
            ChunkOfText("us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk usf sk us Ifsk us Ifsk.", font="Helvetica-Oblique"),
        ], 
        text_alignment=Alignment.LEFT,
        respect_newlines_in_text=True
    )
)

内容的提问来源于stack exchange,提问作者Vamsiram Chalasani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:37:34