0

我的页脚文本可能不止一行,文本的长度会根据用户的姓名和他们工作的公司而有所不同。与所有页脚一样,它需要显示在文档的底部边界下方,以免与 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]

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

4

2 回答 2

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]

那是你要找的吗?

于 2010-11-17T19:05:58.400 回答
1

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

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
于 2010-11-19T16:09:17.233 回答