2010-11-17 3 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, но го прежде чем нет в наличии: ширина опции или возможность иметь обтекание текстом на вторую строку, если это необходимо:

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

Есть ли способ, чтобы получить лучшее из обоих миров? Способ печати ниже нижней границы документа И обеспечить максимальную ширину с помощью переноса строки?

ответ

1

В конце концов я написал свою небольшую рутину для обработки нескольких строк в нижнем колонтитуле. Было бы неплохо, если бы креветка поддерживала что-то подобное из коробки, я все еще немного озадачен, почему некоторые вещи не могут отображаться ниже нижней границы, в то время как другие вещи могут быть. Было бы также неплохо, если бы все различные типы текстовых методов поддерживали атрибут 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

Извините, но ваш код не работает. 'uninitialized constant Prawn :: Core :: Text :: LineWrap' – Kir

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

Это ручной подход, I «Я хочу, чтобы иметь возможность проходить в одной очень длинной строке и иметь соответствующую линию. Мой план резервного копирования - это ручной процесс, когда я определяю, сколько текста может поместиться на одной строке, а затем создайте вторую строку, которая включает в себя оставшийся текст. – Ben5e

 Смежные вопросы

  • Нет связанных вопросов^_^