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

GCP函数用borb生成Firestore发票PDF时遇矩形高度非负错误

解决GCP函数中使用borb生成PDF时的"A Rectangle must have a non-negative height"错误

错误原因分析

这个断言错误本质是borb在布局PDF元素(文本块、容器、表格等)时,计算得出的高度为负数。结合你的使用场景(GCP函数+Firestore payload),常见触发场景包括:

  • Firestore payload中的内容存在超长无换行文本,导致文本渲染高度超出预设容器限制,布局计算时出现负数值
  • GCP函数运行环境缺少borb依赖的系统字体,导致文本高度计算异常
  • 自定义布局逻辑中硬编码了元素高度,或动态计算高度时出现逻辑错误

针对性排查与修复步骤

1. 校验Firestore payload数据

  • 检查买卖方信息、商品描述等字段是否存在超长无换行字符串,这类内容会导致borb无法正确计算文本所需高度,进而触发断言
  • 验证数量、金额等数值是否为非负数,避免动态生成行高时出现异常计算

2. 调整borb布局逻辑

  • 避免硬编码容器高度:如果使用了FixedColumnWidthTable等固定尺寸容器,替换为自适应布局组件(如AutoFitTable),让borb自动计算所需高度:
    from borb.pdf import AutoFitTable
    
    # 替换固定高度表格为自适应
    table = AutoFitTable(number_of_rows=len(payload["items"])+1, number_of_columns=4)
    
  • 设置文本自动换行:对于Paragraph元素,确保开启自动换行并设置合理字号,避免文本溢出容器:
    from borb.pdf import Paragraph, Alignment
    
    seller_paragraph = Paragraph(
        payload["seller"]["info"],
        font_size=10,
        alignment=Alignment.LEFT,
        word_wrap=True  # 确保自动换行
    )
    
  • 检查手动设置的元素参数:确认所有Rectangle、Table等元素的高度参数为非负数,避免布局计算时出现逻辑错误

3. 处理GCP函数环境字体问题

GCP函数默认运行环境缺少部分常用字体,可能导致borb计算文本高度时出错。可以手动嵌入自定义字体:

from borb.pdf import Font, SimpleFontProgram

# 将字体文件(如NotoSans.ttf)打包进函数部署包,加载字体
font_program = SimpleFontProgram.load("NotoSans.ttf")
custom_font = Font.simple_font_program(font_program)

# 使用自定义字体渲染文本
buyer_paragraph = Paragraph(
    payload["buyer"]["name"],
    font=custom_font,
    font_size=12
)

4. 定位具体出错元素

通过报错栈的具体行号,定位触发断言的元素。可以在本地模拟GCP环境,打印元素布局尺寸:

# 在添加元素到页面前,打印计算后的布局尺寸
layout_box = element.get_layout_box(page.get_page_info())
print(f"元素尺寸:宽{layout_box.width},高{layout_box.height}")

如果输出高度为负数,该元素即为问题根源,针对性调整其内容或布局参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:10:22