Ruby中使用Prawn绘制内容为何从底部开始而非顶部?
嘿,这个问题我之前也碰到过!原因其实是Prawn的坐标系规则和咱们日常UI开发习惯不一样——它默认把页面的左下角作为坐标原点(0,0),而不是咱们熟悉的左上角原点。所以你设置at: [0,0]时,文本就被渲染到了页面的左下角区域,也就是视觉上的底部位置。
给你几个实用的解决办法:
方案1:基于内容区域顶部定位
可以通过pdf.bounds.top获取当前页面可绘制区域(已经扣除了你设置的margin)的顶部y坐标,这样就能把文本精准放在顶部:pdf.draw_text "Hello world", at: [0, pdf.bounds.top]方案2:用
text方法替代draw_text
如果不需要精确坐标,text方法更符合常规排版逻辑,它会从页面顶部的当前光标位置开始渲染文本:pdf.text "Hello world"方案3:手动计算自定义位置
要是你需要特定偏移量的位置,也可以用页面高度减去偏移值来计算y坐标:# 比如距离页面顶部10mm的位置 pdf.draw_text "Hello world", at: [0, pdf.page_height - 10.mm]注意
pdf.page_height是整个页面的高度(包含margin),如果要基于扣除margin后的内容区域,还是用pdf.bounds.top更准确。
调整后的完整代码参考:
require 'prawn' require 'prawn/measurement_extensions' def self.generate pdf = Prawn::Document.new(page_size: 'A4', margin: [5.mm, 10.mm, 5.mm, 10.mm]) # 把文本放在内容区域顶部 pdf.draw_text "Hello world", at: [0, pdf.bounds.top] pdf.dash 2, space: 3 pdf.vertical_line 0, 100, :at => 0 pdf.line_width = 0.5 pdf.stroke pdf.render_file "#{__dir__}/test.pdf" end
内容的提问来源于stack exchange,提问作者Hung
相关产品推荐
相关产品推荐

