Prawn PDF中的多行页脚

时间:2010-11-17 16:53:23

标签: ruby-on-rails prawn prawnto

我的页脚文本可能超过一行,文本的长度将根据用户的名称和他们工作的公司而有所不同。与所有页脚一样,它需要显示在文档的下限之下,以便它不会与PDF的主要内容混合。

问题在于我在Prawn中找到的唯一原因是在文档底部下方打印文本是使用#draw_text。这与number_pages用于使其文本显示在文档底部边界下方的方法相同。然而,使用#draw_text的一个警告似乎是它无法将文本包装到第二行。

我找到了许多方法,允许我将文本包装到第二行,如#text_box,#bounding_box等,但这些方法的警告是它们不允许您在文档的下限下打印任何内容。

例如,以下内容不会在文档上打印任何内容,因为它会低于文档的下限:

text_box "Generated by Tom Cruise for Universal Studios", :at => [bounds.left, 0], :width => 200

以下内容会在文档上打印,因为它位于文档的下限内,但也会打印在已存在的任何内容之上:

text_box "Generated by Tom Cruise for Universal Studios", :at => [bounds.left, bounds.bottom - 20], :width => 200

最后,下面将打印文档的下限,确保它不会打印在PDF中的任何现有内容之上,但是没有可用的:width选项或将文本换行到第二个的能力如果需要的话:

draw_text "Generated by Tom Cruise for Universal Studios", :at => [bounds.left, 0]

有没有办法让两全其美?一种在文档底部边界下方打印的方法,并使用换行强制执行最大宽度?

2 个答案:

答案 0 :(得分:1)

我怀疑你需要手动换行(例如计算什么时候打破)。

但我能够使用标准的number_pages方法和以下内容获得多行页脚:

pdf.number_pages "Copyright #{Time.now.year} Company.", [pdf.bounds.left, 0]
pdf.number_pages "Profile generated on #{Time.now.strftime('%B %d, %Y')}.", [pdf.bounds.left, 10]

这就是你要找的东西吗?

答案 1 :(得分:1)

我最终编写了自己的小程序来处理页脚中的多行。如果Prawn开箱即用支持这样的东西会很好,我仍然有点神秘,为什么有些东西不能在底部下方显示,而其他的东西可以。如果所有不同类型的文本方法都支持:带有换行的宽度属性,那也很好......但我离题了,这是我最终使用的代码:

line_wrapper = Prawn::Core::Text::LineWrap.new

repeat :all do
  str = "Generated on " + Time.zone.now.strftime("%m/%d/%y at %I:%M:%S %p %Z") + " by #{user.full_name} at #{user.company.name}"
  starting_position = 0
  while !str.blank?
    single_line = line_wrapper.wrap_line(str, :width => 470, :document => pdf)
    draw_text(single_line, :at => [bounds.left, starting_position])
    starting_position -= 10
    str.slice!(single_line)
  end
end