如何使用borb创建动态高度PDF文档适配热敏打印无空白需求
问题解答
可以明确:borb支持预先测算内容尺寸,完全可以实现你需要的「固定宽度、高度随内容动态调整」的热敏打印PDF需求,具体实现逻辑如下:
1. 基础单位转换
首先先确定你的热敏纸宽度,PDF默认使用点(pt)作为长度单位,转换规则为:1pt = 1/72英寸 = 0.3527mm,常用规格转换参考:
- 58mm热敏纸:对应宽度约为
58 / 25.4 * 72 ≈ 164pt - 80mm热敏纸:对应宽度约为
80 / 25.4 * 72 ≈ 227pt
2. 内容高度测算方法
borb的所有可渲染元素(文本段落、表格、图片、布局容器等)都提供get_layout_box方法,可以在不实际渲染到页面的前提下,返回元素在指定宽度下占用的实际尺寸:
from borb.pdf.canvas.layout.text.paragraph import Paragraph from borb.pdf.canvas.geometry.rectangle import Rectangle # 预设页面参数 FIXED_WIDTH = 164 # 58mm热敏纸对应宽度,单位pt PAGE_MARGIN = 10 # 上下左右边距,单位pt content_width = FIXED_WIDTH - 2 * PAGE_MARGIN # 构建你需要渲染的内容,和实际渲染时的参数保持完全一致 p = Paragraph( "这是一段测试用的长文本,用来模拟热敏打印的内容,可能包含多行会自动换行,我们需要先测算这段内容占的总高度,再动态设置页面高度。" * 10, font_size=9, line_spacing=1.2 ) # 测算尺寸:传入可用的矩形区域,这里宽度用实际可用内容宽度,高度先填一个足够大的最大值即可 bounding_box: Rectangle = p.get_layout_box(Rectangle(0, 0, content_width, 10000)) content_height = bounding_box.get_height()
3. 动态生成适配高度的页面
拿到实际内容高度后,直接自定义页面尺寸,再渲染内容即可,完全不会出现多余空白:
from borb.pdf import Document from borb.pdf import Page from borb.pdf import PageLayout from borb.pdf import SingleColumnLayout from borb.pdf import PDF # 计算最终页面高度:内容高度 + 上下边距 page_height = content_height + 2 * PAGE_MARGIN # 构建文档和自定义尺寸的页面 doc = Document() page = Page(width=FIXED_WIDTH, height=page_height) doc.add_page(page) # 布局渲染内容 layout: PageLayout = SingleColumnLayout(page, horizontal_margin=PAGE_MARGIN, vertical_margin=PAGE_MARGIN) layout.add(p) # 保存PDF with open("thermal_receipt.pdf", "wb") as f: PDF.dumps(f, doc)
注意事项
- 测算内容尺寸时,所有文本格式、间距、边距参数必须和实际渲染时的参数完全一致,否则会出现高度计算误差
- 插入图片时需要先按内容宽度计算等比例缩放后的高度,再参与总高度计算,避免图片拉伸变形
- borb支持单页最大高度远超普通打印纸规格,完全适配热敏打印的长页需求
内容的提问来源于stack exchange,提问作者john-h-watson
相关产品推荐
相关产品推荐

