私はエビに関するすべての関連記事を読みましたが、ヘッダーとフッターについて(エビ自身のドキュメントでさえ)言及されていませんでした。
ただし、ヘッダーとフッターについては、Prawnto自身のWebサイトでデモを見ました。デモのソース全体をコピーして、機能するかどうかを確認しましたが、未定義のメソッド「ヘッダー」のエラーが報告されています。エビは最近ジェムでヘッダーとフッターを取り出したことを理解できますか?それともヘッダーとフッターを使用するために最初に行う必要がある何かがありますか?
デモページ: http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer
問題のコードの一部:
Prawn::Document.generate("flow_with_headers_and_footers.pdf") do
header margin_box.top_left do
text "Here's My Fancy Header", :size => 25, :align => :center
end
text "hello world!"
end
ヘッダーとは、念のため、通常はドキュメントのすべてのページの隅に表示される単語の断片を意味します。請求書ページの口座番号のように。
ありがとう!
例では@GrantSayer thxですが、これにより現在のページ番号のみが表示され、ページの総数は表示されません。
number_pages関数をフッターに使用することもできます。
Prawn::Document.generate("page_with_numbering.pdf") do
text "Hai"
start_new_page
text "bai"
start_new_page
text "-- Hai again"
number_pages "<page> in a total of <total>", [bounds.right - 50, 0]
end
ただし、私の場合は、会社のスタイルガイドと一致するように、ページ番号をフォーマット/スタイル設定して右揃えにする必要もあります。 go_to_page(k) を使用して独自のヘッダーおよびフッター関数を作成し、各ページにヘッダーとフッターを追加しましたafterすべてのページが作成されます。これにより、スタイル設定のオプションとページの総数の両方が得られます。
Prawn::Document.generate("footer_example.pdf", :skip_page_creation => true) do
10.times do
start_new_page
text "Some filler text for the page"
end
# footer
page_count.times do |i|
go_to_page(i+1)
lazy_bounding_box([bounds.right-50, bounds.bottom + 25], :width => 50) {
text "#{i+1} / #{page_count}"
}.draw
end
end
Prawntoプラグインから参照しているサンプルは、古いバージョンのprawnを使用しています。
ヘッダーとフッターも必要だったので、これについてもう少し調べました。そのバージョンのエビには、遅延バウンディングボックスを使用して実装されたヘッダーメソッドとフッターメソッドがあったようです。 (githubのコードをチェックして見つかりました)
新しいエビバージョンでは、リピーターを使用して同じことを行うことができます。
以下は、新しいバージョンを使用して書き換えられた完全なサンプルです。
require "#{File.dirname(__FILE__)}/../example_helper.rb"
Prawn::Document.generate("test.pdf") do
repeat :all do
# header
bounding_box [bounds.left, bounds.top], :width => bounds.width do
font "Helvetica"
text "Here's My Fancy Header", :align => :center, :size => 25
stroke_horizontal_rule
end
# footer
bounding_box [bounds.left, bounds.bottom + 25], :width => bounds.width do
font "Helvetica"
stroke_horizontal_rule
move_down(5)
text "And here's a sexy footer", :size => 16
end
end
bounding_box([bounds.left, bounds.top - 50], :width => bounds.width, :height => bounds.height - 100) do
text "this is some flowing text " * 200
move_down(20)
font "#{Prawn::BASEDIR}/data/fonts/DejaVuSans.ttf"
table [["ὕαλον ϕαγεῖν", "baaar", "1" ],
["This is","a sample", "2" ],
["Table", "dont\ncha\nknow?", "3" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules\nwith an iron fist", "x" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ],
[ "It", "Rules", "4" ]],
:font_size => 24,
:horizontal_padding => 10,
:vertical_padding => 3,
:border_width => 2,
:position => :center,
:headers => ["Column A","Column B","#"]
end
end
リピーターの必要な場所を正確に指定できる他のオプションについては、リピートのドキュメントページを確認してください。
最新バージョンのエビとは少し違いますが、ハッシュを渡す必要があります
Prawn::Document.generate("page_with_numbering.pdf") do
text "Hai"
start_new_page
text "bai"
start_new_page
text "-- Hai again"
number_pages "<page> in a total of <total>", { :start_count_at => 0, :page_filter => :all, :at => [bounds.right - 50, 0], :align => :right, :size => 14 }
end
テキストを上書きしないフッターが必要な場合は、bounding_box
を使用して、ドキュメントのマージンの下にbounds.bottom
を作成する必要があります。
require 'prawn'
file_name = 'hello.pdf'
random_table = (0..50).map{|i|[*('a'..'z')]} # generate a 2D array for example (~2 pages)
Prawn::Document::generate(file_name) do |pdf|
pdf.table random_table
pdf.page_count.times do |i|
pdf.bounding_box([pdf.bounds.left, pdf.bounds.bottom], :width => pdf.bounds.width, :height => 30) {
# for each page, count the page number and write it
pdf.go_to_page i+1
pdf.move_down 5 # move below the document margin
pdf.text "#{i+1}/#{pdf.page_count}", :align => :center # write the page number and the total page count
}
end
end
それはそのように見えるはずです、あなたはフッターがマージンの底の外にあることがわかります:
それが誰かを助けることを願って
編集を開始
これはエビで機能します> = 0.12
編集終了
リピート、キャンバス、セルを使用した私のソリューションは次のとおりです。基本的に私は、すべてのページの最上部と最下部にバウンディングボックスを描画しています。セルを使用して、スタイルをより適切に制御できるようにしています。これが誰かに役立つことを願っています。 (ヘッダーとフッターのスタイルをどのように制御できるかをわかりやすく示すために、少し迷惑な色を使用しました)
Prawn::Document.generate("headers_and_footers_with_background.pdf") do
repeat :all do
# header
canvas do
bounding_box([bounds.left, bounds.top], :width => bounds.width) do
cell :content => 'Header',
:background_color => 'EEEEEE',
:width => bounds.width,
:height => 50,
:align => :center,
:text_color => "001B76",
:borders => [:bottom],
:border_width => 2,
:border_color => '00FF00',
:padding => 12
end
end
# footer
canvas do
bounding_box [bounds.left, bounds.bottom + 50], :width => bounds.width do
cell :content => 'Footer',
:background_color => '333333',
:width => bounds.width,
:height => 50,
:align => :center,
:text_color => "FFFFFF",
:borders => [:top],
:border_width => 2,
:border_color => 'FF0000',
:padding => 12
end
end
end
# body
bounding_box([bounds.left, bounds.top - 25], :width => bounds.width, :height => bounds.height - 50) do
100.times do
text "Some filler text for the page"
end
end
end
ページで繰り返しアイテムを取得する唯一の方法は、Prawn::Document::LazyBoundingBox
方法。基本的に、これにより、呼び出したときにのみレンダリングされる境界ボックスを定義できます。したがって、通常のpseudo-code
ステップは
1. Define lazy bounding box element assign to somevar
2. One each new page call the element.
ソースからの例は、
file = "lazy_bounding_boxes.pdf"
Prawn::Document.generate(file, :skip_page_creation => true) do
point = [bounds.right-50, bounds.bottom + 25]
page_counter = lazy_bounding_box(point, :width => 50) do
text "Page: #{page_count}"
end
10.times do
start_new_page
text "Some filler text for the page"
page_counter.draw
end
終わり
これにより、新しいページごとにページ数テキストが出力されます。要素をレンダリングするために手動で呼び出すことなく再利用されるページテンプレートの設定にこれを適用できれば理想的です。テキストフローと組み合わせると、ヘッダーとフッターの従来のソリューションが得られます。
カスタムフッターのコンテンツを作成するためにbounding_box
を使用する場合の問題は次のとおりです...マージンの範囲内でレンダリングされています。
私は内容を書き込むものを探していましたマージン領域にとともにnumber_pages
。(通常、フッターが下部マージン領域に設定されているため)...そしてそこにあるようですなし。
代わりに、text_box
を使用して、次のように座標をメインの境界ボックスの外側に配置します。
repeat :all do
text_box "My custom footer", size: 7, align: :center, :at => [bounds.left, bounds.bottom], :height => 100, :width => bounds.width
end
repeat :all
は、このフッターテキストをすべてのページにレンダリングすることに注意してください。