大虾网格布局:动态内容与后续行发生冲突

Prawn grid layout: Dynamic content colliding with subsequent rows

我想在 pdf 文档的不同位置指定列。

示例:此部分三列,该部分一列,另一部分两列。

我不希望将行绑定到 pdf 文档上的物理位置,因为我有各种长度的动态文本,所以我无法预测某个区域内有多少内容。发生的情况是,如果 [column, row] 框的文本太多,它只会溢出到后续行,与那里的文本发生冲突。

prawn 中的布局网格似乎迫使我指定行数。
如果我可以像 bootstrap 那样动态定义行,那就太好了。这样一来,一行中的内容不会开始,直到前一行占据了它需要的所有 space 。

以下是我的理解,您必须在 Prawn 中定义布局网格:

    pdf.define_grid(columns: 12, rows: 12, gutter: 10)

所以说我做了这样的事情:

pdf.grid([0,0]).bounding_box do
  pdf.text "Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Maecenas faucibus mollis interdum."
end

pdf.grid([1,0]).bounding_box do
  pdf.text "some text"
end

显然[0,0]边界框中的文字会与[1,0]边界框中的文字发生冲突,因为[0,0]中的内容太多,所以溢出到它下面的行。

因为 bootstrap 没有粘在物理 columns/rows 布局网格上,Bootstrap 允许 [0,0] 中的内容占用 space需要然后开始 [1,0] 内容。

问题是 prawn 的布局网格似乎直接应用于 pdf 文档的物理位置,但我不希望它那样做。

希望这是有道理的。在 Prawn 中有这样的可能吗?否则我预见到自己不得不完全放弃我的 pdf 的专栏,这将呈现大量空白 space。

Prawn PDF manual,第 74 页的布局信息

我认为网格是用于表格的。 Column_box 看起来更适合你的问题:

column_box([0, cursor], :columns => 2, :width => bounds.width) do
  text("a bunch of text ...")
end

希望我理解正确。

我会按照第一个答案中的建议使用 Prawn table。 为此添加 gem 'prawn-table' 并使用如下代码:

pdf = Prawn::Document.new

# First section with two columns
pdf.table([['column_text_1', 'column_text_2']])

# Second section with three columns
pdf.table([['column_text_1', 'column_text_2', 'column_text_3']])

如果您需要更高级的东西,可以参考 gem documentation 或在此处发表评论。

有大虾table,可以这样:

require 'prawn'
require 'prawn/table'

Prawn::Document.generate("junk4.pdf") do

  font "Helvetica"

  text "Test Table", :style => :bold_italic
  stroke_horizontal_rule

  move_down 20

  table([ ["short", "short", "loooooooooooooooooooong "*30],
          ["short", "loooooooooooooooooooong "*15, "short"],
          ["loooooooooooooooooooong "*10, "short", "short"] ])

end