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
相关产品推荐
相关产品推荐

