2010-11-17 29 views
0

我的頁腳文本可能不止一行,文本的長度會因用戶的名字和他們工作的公司而異。像所有頁腳一樣,它需要顯示在文檔底部下方,以便它不會與PDF的主要內容混雜在一起。Prawn中的多行頁腳PDF

問題是,我發現在蝦的文檔底部邊界下面打印文本的唯一原因是使用#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中的任何現有內容的上方,但日ERE沒有可用的:寬度選項,或者需要有文本換行到第二行的能力:

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

是否有一種方式來獲得兩全其美嗎?在文檔的底部邊界下面打印並使用換行實現最大寬度的一種方法?

回答

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 
+0

對不起,但你的代碼不起作用。 '未初始化的常量Prawn :: Core :: Text :: LineWrap' – Kir 2011-05-31 14:42:42

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] 

是你在找什麼?

+0

這是一個手動方法,我看起來能夠傳遞一個很長的字符串並相應地進行換行。我的備份計劃是一個手動過程,可以確定在一行中可以容納多少文本,然後生成包含剩餘文本的第二行。 – Ben5e 2010-11-19 15:36:22