让Prawn布局文本就像一个绝对定位的HTML段落

时间:2013-11-20 04:29:57

标签: ruby prawn

我试图让Prawn文本像HTML中的绝对定位段一样,因为段落只会与它包含的文本一样宽。

最好看一个例子:

在HTML中,以下内容:

<p class="left-align">Here's some left-aligned text,<br/>bla bla bla</p>
<p class="center-align">Here's some center-aligned text,<br/>bla bla bla</p>
<p class="right-align">Here's some right-aligned text,<br/>bla bla bla</p>
<style>
p {
    background:yellow;
    border:solid 1px black;
    position:absolute;
}
.left-align {
    text-align:left;
    left:20px; top:0;
}
.center-align {
    text-align:center;
    left:20px; top:50px;
}
.right-align {
    text-align:right;
    left:20px; top:100px;
}
</style>

会导致这个:

enter image description here

正如您所看到的,这些段落只会与其内容一样宽(有关完整示例,请参阅 fiddle )。

布局方面,这是我想在Prawn中实现的,但是当我尝试以下内容时:

pdf.text_box "Here's some left text,\nbla bla bla", :at => [20, page_height], :align => :left
pdf.text_box "Here's some center text,\nbla bla bla", :at => [20, page_height-50], :align => :center
pdf.text_box "Here's some right text,\nbla bla bla", :at => [20, page_height-100], :align => :right

我的结果是 this

enter image description here

类似于向p元素添加width:100%

1 个答案:

答案 0 :(得分:6)

您必须提供文本框的宽度,否则text_box将使用页面宽度减去起始位置。

为了计算字符串宽度,您应该使用Prawn库提供的width_of方法,但由于某种原因,Prawn无法识别\n中的width_of字符方法,然后你必须手动拆分并分别计算线宽,这不是那么困难:

def text_width(pdf, text)
  # slip by new line char and find maximum text width
  text.split("\n").map {|s| pdf.width_of(s)}.max
end

在代码中插入text_width

pdf.text_box s = "Here's some left text,\nbla bla bla", 
  :at     => [20, page_height], 
  :align  => :left,
  :width  => text_width(pdf, s)

pdf.text_box s = "Here's some center text,\nbla bla bla", 
  :at     => [20, page_height-50], 
  :align  => :center,
  :width  => text_width(pdf, s)

pdf.text_box s = "Here's some right text,\nbla bla bla", 
  :at     => [20, page_height-100], 
  :align  => :right,
  :width  => text_width(pdf, s)