13

ページの上半分を占める最初のページにタイトルを表示したいとしましょう。次に、ページの下半分が記事のテキストでいっぱいになり、テキストがなくなるまで後続のページに流れ続けます。

ここに画像の説明を入力

これは非常に基本的なレイアウト シナリオですが、Prawn でそれを実装する方法がわかりません。

オンライン ドキュメントから派生したサンプル コードを次に示します。

pdf = Prawn::Document.new do
  text "The Prince", :align => :center, :size => 48
  text "Niccolò Machiavelli", :align => :center, :size => 20
  move_down 42

  column_box([0, cursor], :columns => 3, :width => bounds.width) do
  text((<<-END.gsub(/\s+/, ' ') + "\n\n") * 20)
   All the States and Governments by which men are or ever have been ruled,
   have been and are either Republics or Princedoms. Princedoms are either
   hereditary, in which the bla bla bla bla .....
   END
  end
end.render

しかし、それはすべてのページのタイトルスペースを表示し続けるだけです:

ここに画像の説明を入力

これを行う正しい方法は何ですか?

4

5 に答える 5

2

したがって、このcolumn_boxメソッドは境界ボックスを作成します。文書化されたバウンディング ボックスの動作は、次のページに変更された場合、前のページと同じ位置から始まるというものです。したがって、あなたが見ている動作は基本的に正しいものであり、あなたが望むものでもありません。spanスパンにはこの動作がないため、グーグルで見つけた推奨される回避策は、代わりに a を使用することです。

問題は、スパンを使用してテキスト列を作成する方法です。スパンをネイティブにサポートしていないようです。スパンを持つ列を模倣する小さなスクリプトを作成しようとしました。列ごとに 1 つのスパンが作成され、それに応じて整列されます。text_box次に、オプションを持つ でテキストを書き込みoverflow: :truncateます。これにより、メソッドはテキスト ボックスに収まらなかったテキストを返すようになり、このテキストを次の列に表示できるようになります。コードにはおそらく多少の調整が必要ですが、これを行う方法を示すには十分なはずです。

require 'prawn'

text_to_write = ((<<-END.gsub(/\s+/, ' ') + "\n\n") * 20)
 All the States and Governments by which men are or ever have been ruled,
 have been and are either Republics or Princedoms. Princedoms are either
 hereditary, in which the bla bla bla bla .....
 END

pdf = Prawn::Document.generate("test.pdf") do
  text "The Prince", :align => :center, :size => 48
  text "Niccolò Machiavelli", :align => :center, :size => 20
  move_down 42

  starting_y = cursor
  starting_page = page_number

  span(bounds.width / 3, position: :left) do
    text_to_write = text_box text_to_write, at: [bounds.left, 0], overflow: :truncate
  end

  go_to_page(starting_page)
  move_cursor_to(starting_y)

  span(bounds.width / 3, position: :center) do
    text_to_write = text_box text_to_write, at: [bounds.left, 0], overflow: :truncate
  end

  go_to_page(starting_page)
  move_cursor_to(starting_y)

  span(bounds.width / 3, position: :right) do
    text_box text_to_write, at: [bounds.left, 0]
  end
end

これが理想的な解決策ではないことはわかっています。しかし、これは私が思いつくことができる最高のものでした。

于 2013-06-29T13:41:02.777 に答える
-1

代わりにエビのグリッド レイアウトを使用してください。非常によく文書化されており、レイアウトを簡単に制御できます。

于 2013-06-29T15:11:12.413 に答える